Paso 5- Trayectorias de hospitalización y mortalidad con foco en condiciones vinculadas a trastornos de salud mental y consumo de sustancias posterior a un primer ingreso por alguno de estos trastornos, en usuarios/as jóvenes y adultos emergentes de población general y pertenecientes a pueblos originarios, 2018-2021, Chile

Representar las mejores opciones de agrupamiento, junto con su relación con otras variables (para poster)

Author

Andrés González Santa Cruz

Published

October 2, 2024

Configurar

Code
# remover objetos y memoria utilizada
rm(list=ls());gc()
          used (Mb) gc trigger (Mb) max used (Mb)
Ncells  596638 31.9    1347497   72   686445 36.7
Vcells 1122406  8.6    8388608   64  1876197 14.4
Code
if(Sys.info()["sysname"]=="Windows"){
 folder_path <- ifelse(dir.exists("H:/Mi unidad/PERSONAL ANDRES/UCH_salud_publica/asignaturas/un_inv_II/"),
                       "H:/Mi unidad/PERSONAL ANDRES/UCH_salud_publica/asignaturas/un_inv_II/",
                       "C:/Users/CISS Fondecyt/Mi unidad/Alvacast/SISTRAT 2022 (github)/_proposal_grant/2023/")
} else {folder_path <- ""}
load(paste0(folder_path,"20240903.RData"))

Paquetes estadísticos

Code
#elegir repositorio
if(Sys.info()["sysname"]=="Windows"){
  options(repos = c(CRAN = "https://cran.dcc.uchile.cl/"))
}
options(install.packages.check.source = "yes") # Chequea la fuente de los paquetes

#borrar caché
#system("fc-cache -f -v")

if(!require(pacman)){install.packages("pacman");require(pacman)}

pacman::p_unlock(lib.loc = .libPaths()) #para no tener problemas reinstalando paquetes

if(Sys.info()["sysname"]=="Windows"){
if (getRversion() != "4.4.0") { stop("Requiere versión de R 4.4.0. Actual: ", getRversion()) }
}

if(!require(job)){install.packages("job");require(job)}
if(!require(kableExtra)){install.packages("kableExtra");require(kableExtra)}
if(!require(tidyverse)){install.packages("tidyverse");require(tidyverse)}
if(!require(cluster)){install.packages("cluster"); require(cluster)}
if(!require(WeightedCluster)){install.packages("WeightedCluster"); require(WeightedCluster)}
if(!require(devtools)){install.packages("devtools"); require(devtools)}
if(!require(TraMineR)){install.packages("TraMineR"); require(TraMineR)}
if(!require(TraMineRextras)){install.packages("TraMineRextras"); require(TraMineRextras)}
if(!require(NbClust)){install.packages("NbClust"); require(NbClust)}
if(!require(haven)){install.packages("haven"); require(haven)}
if(!require(ggseqplot)){install.packages("ggseqplot"); require(ggseqplot)}
if(!require(gridExtra)){install.packages("gridExtra"); require(gridExtra)}
if(!require(Tmisc)){install.packages("Tmisc"); require(Tmisc)}
if(!require(factoextra)){install.packages("factoextra"); require(factoextra)}
if(!require(stargazer)){install.packages("stargazer"); require(stargazer)}
if(!require(gtsummary)){install.packages("gtsummary"); require(gtsummary)}
if(!require(lmtest)){install.packages("lmtest"); require(lmtest)}
if(!require(emmeans)){install.packages("emmeans"); require(emmeans)}
if(!require(fpp2)){install.packages("fpp2"); require(fpp2)}
if(!require(purrr)){install.packages("purrr"); require(purrr)}
if(!require(forecast)){install.packages("forecast"); require(forecast)}
if(!require(magrittr)){install.packages("magrittr"); require(magrittr)}
if(!require(foreach)){install.packages("foreach"); require(foreach)}
if(!require(doParallel)){install.packages("doParallel"); require(doParallel)}
if(!require(progressr)){install.packages("progressr"); require(progressr)}
if(!require(chisq.posthoc.test)){devtools::install_github("ebbertd/chisq.posthoc.test")}
if(!require(rstatix)){install.packages("rstatix"); require(rstatix)}


seq_mean_t_dos_grupos <- function(bd = NULL, group1, group2) {
  # Agrupar por ambas variables
  resultados <- by(bd, list(group1, group2), seqmeant)
  
  # Obtener todas las combinaciones posibles de los grupos
  combinaciones <- expand.grid(group1 = unique(group1), group2 = unique(group2), stringsAsFactors = FALSE)
  
  # Extraer los resultados y asociarlos con las combinaciones
  resultados_df <- do.call(rbind, lapply(seq_along(resultados), function(i) {
    group_name1 <- attr(resultados, "dimnames")[[1]][i]
    group_name2 <- attr(resultados, "dimnames")[[2]][i]
    
    data.frame(factor_inclusivo_1 = group_name1, 
               factor_inclusivo_2 = group_name2, 
               Mean = resultados[[i]])
  }))
  
  # Unir los resultados con las combinaciones para rellenar los valores faltantes
  final_df <- merge(combinaciones, resultados_df, by.x = c("group1", "group2"), 
                    by.y = c("factor_inclusivo_1", "factor_inclusivo_2"), all.x = TRUE)
  
  return(final_df)
}

multinom_pivot_wider <- function(x) {
  # check inputs match expectatations
  # create tibble of results
  df <- tibble::tibble(outcome_level = unique(x$table_body$groupname_col))
  df$tbl <- 
    purrr::map(
      df$outcome_level,
      function(lvl) {
        gtsummary::modify_table_body(
          x, 
          ~dplyr::filter(.x, .data$groupname_col %in% lvl) %>%
            dplyr::ungroup() %>%
            dplyr::select(-.data$groupname_col)
        )
      }
    )
  
  tbl_merge(df$tbl, tab_spanner = paste0("**", df$outcome_level, "**"))
}

best_subset_multinom <- function(y, x.vars, data) {
  # y       Nombre de la variable dependiente (cadena de texto)
  # x.vars  Vector de nombres de predictores (caracter)
  # data    Dataframe con los datos de entrenamiento
  
  # Cargar las librerías necesarias
  require(dplyr)
  require(purrr)
  require(tidyr)
  require(nnet)
  require(MASS)
  
  # Generar todas las combinaciones posibles de predictores
  predictors_list <- lapply(1:length(x.vars), function(i) {
    combn(x.vars, i, simplify = FALSE)
  }) %>% unlist(recursive = FALSE)
  
  # Inicializar una lista para almacenar los resultados
  results <- list()
  
  # Iterar sobre cada combinación de predictores
  for (i in seq_along(predictors_list)) {
    predictors <- predictors_list[[i]]
    formula <- as.formula(paste(y, "~", paste(predictors, collapse = "+")))
    
    # Ajustar el modelo multinomial
    model <- tryCatch(
      nnet::multinom(formula, data = data, trace = FALSE),
      error = function(e) NULL
    )
    
    # Si el modelo se ajustó correctamente, almacenar los resultados
    if (!is.null(model)) {
      # Extraer el AIC del modelo
      aic <- AIC(model)
      
      # Almacenar la información en una lista
      results[[length(results) + 1]] <- list(
        predictors = predictors,
        model = model,
        AIC = aic
      )
    }
  }
  
  # Convertir la lista de resultados en un dataframe
  results_df <- results %>%
    purrr::map_df(function(res) {
      data.frame(
        predictors = paste(res$predictors, collapse = "+"),
        AIC = res$AIC,
        stringsAsFactors = FALSE
      )
    })
  
  # Ordenar los modelos por AIC de menor a mayor
  results_df <- results_df %>% arrange(AIC)
  
  return(results_df)
}
best_subset_multinom_interactions <- function(y, x.vars, data) {
  # y       Nombre de la variable dependiente (cadena de texto)
  # x.vars  Vector de nombres de predictores (caracter)
  # data    Dataframe con los datos de entrenamiento
  
  # Cargar las librerías necesarias
  require(dplyr)
  require(purrr)
  require(tidyr)
  require(nnet)
  require(MASS)
  
  # Generar todas las combinaciones posibles de predictores (efectos principales)
  main_effects_list <- lapply(1:length(x.vars), function(i) {
    combn(x.vars, i, simplify = FALSE)
  }) %>% unlist(recursive = FALSE)
  
  # Inicializar una lista para almacenar los resultados
  results <- list()
  
  # Iterar sobre cada combinación de efectos principales
  for (main_effects in main_effects_list) {
    
    # Generar términos de interacción de hasta 3 variables
    interaction_terms <- list()
    
    # Para interacciones de 2 variables
    if (length(main_effects) >= 2) {
      interaction_terms_2way <- combn(main_effects, 2, function(x) paste(x, collapse = ":"))
      interaction_terms <- c(interaction_terms, interaction_terms_2way)
    }
    
    # Para interacciones de 3 variables
    if (length(main_effects) >= 3) {
      interaction_terms_3way <- combn(main_effects, 3, function(x) paste(x, collapse = ":"))
      interaction_terms <- c(interaction_terms, interaction_terms_3way)
    }
    
    # Combinar efectos principales e interacciones
    all_terms <- c(main_effects, interaction_terms)
    
    # Generar todas las combinaciones posibles de términos (incluyendo interacciones)
    # Solo se incluyen interacciones si sus efectos principales están presentes
    term_combinations <- list()
    
    # Obtener todos los subconjuntos de efectos principales
    main_effects_subsets <- lapply(1:length(main_effects), function(i) {
      combn(main_effects, i, simplify = FALSE)
    }) %>% unlist(recursive = FALSE)
    
    # Para cada subconjunto de efectos principales
    for (me in main_effects_subsets) {
      # Iniciar con los efectos principales
      terms <- me
      
      # Incluir interacciones solo si todos sus efectos principales están incluidos
      possible_interactions <- interaction_terms[
        sapply(interaction_terms, function(x) {
          vars_in_interaction <- unlist(strsplit(x, ":"))
          all(vars_in_interaction %in% me)
        })
      ]
      
      # Generar todas las combinaciones de interacciones para incluir
      interaction_subsets <- list(NULL)
      if (length(possible_interactions) > 0) {
        interaction_subsets <- lapply(1:length(possible_interactions), function(i) {
          combn(possible_interactions, i, simplify = FALSE)
        }) %>% unlist(recursive = FALSE)
      }
      
      # Para cada combinación de interacciones, crear el conjunto completo de términos
      for (ints in interaction_subsets) {
        if (is.null(ints)) {
          full_terms <- terms
        } else {
          full_terms <- c(terms, ints)
        }
        
        # Añadir a la lista de combinaciones de términos
        term_combinations <- append(term_combinations, list(full_terms))
      }
    }
    
    # Ajustar modelos para cada combinación de términos
    for (terms in term_combinations) {
      formula <- as.formula(paste(y, "~", paste(terms, collapse = "+")))
      
      # Ajustar el modelo multinomial
      model <- tryCatch(
        nnet::multinom(formula, data = data, trace = FALSE),
        error = function(e) NULL,
        warning = function(w) NULL
      )
      
      # Si el modelo se ajustó correctamente, almacenar los resultados
      if (!is.null(model)) {
        # Extraer el BIC del modelo
        bic <- BIC(model)
        
        # Almacenar la información en la lista de resultados
        results[[length(results) + 1]] <- list(
          predictors = paste(terms, collapse = " + "),
          model = model,
          BIC = bic
        )
      }
    }
  }
  
  # Convertir la lista de resultados en un dataframe
  results_df <- results %>%
    purrr::map_df(function(res) {
      data.frame(
        predictors = res$predictors,
        BIC = res$BIC,
        stringsAsFactors = FALSE
      )
    })
  
  # Ordenar los modelos por BIC de menor a mayor
  results_df <- results_df %>% arrange(BIC)
  
  return(results_df)
}

best_subset_multinom_interactions_parallel <- function(y, x.vars, data) {
  # y       Nombre de la variable dependiente (cadena de texto)
  # x.vars  Vector de nombres de predictores (caracter)
  # data    Dataframe con los datos de entrenamiento
  
  # Cargar las librerías necesarias dentro de la función
  require(dplyr)
  require(purrr)
  require(tidyr)
  require(nnet)
  require(MASS)
  require(foreach)
  require(doParallel)
  require(progressr)
  
  # Iniciar los gestores de progreso
  handlers(global = TRUE)
  handlers("txt")
  
  # Generar todas las combinaciones posibles de predictores (efectos principales)
  main_effects_list <- lapply(1:length(x.vars), function(i) {
    combn(x.vars, i, simplify = FALSE)
  }) %>% unlist(recursive = FALSE)
  
  # Inicializar una lista para almacenar las fórmulas de los modelos
  formulas_list <- list()
  
  # Generar todas las fórmulas posibles con interacciones hasta de 3 variables
  for (main_effects in main_effects_list) {
    
    # Generar términos de interacción de hasta 3 variables
    interaction_terms <- character(0)  # Aseguramos que es un vector de caracteres
    
    # Para interacciones de 2 variables
    if (length(main_effects) >= 2) {
      interaction_terms_2way <- combn(main_effects, 2, function(x) paste(x, collapse = ":"), simplify = TRUE)
      interaction_terms <- c(interaction_terms, interaction_terms_2way)
    }
    
    # Para interacciones de 3 variables
    if (length(main_effects) >= 3) {
      interaction_terms_3way <- combn(main_effects, 3, function(x) paste(x, collapse = ":"), simplify = TRUE)
      interaction_terms <- c(interaction_terms, interaction_terms_3way)
    }
    
    # Generar todas las combinaciones posibles de efectos principales
    main_effects_subsets <- lapply(1:length(main_effects), function(i) {
      combn(main_effects, i, simplify = FALSE)
    }) %>% unlist(recursive = FALSE)
    
    # Para cada subconjunto de efectos principales
    for (me in main_effects_subsets) {
      # Iniciar con los efectos principales
      terms <- me
      
      # Identificar interacciones cuyos efectos principales están en 'me'
      if (length(interaction_terms) > 0) {
        possible_interactions <- interaction_terms[
          vapply(interaction_terms, function(x) {
            vars_in_interaction <- unlist(strsplit(x, ":"))
            all(vars_in_interaction %in% me)
          }, FUN.VALUE = logical(1))
        ]
      } else {
        possible_interactions <- character(0)
      }
      
      # Generar todas las combinaciones posibles de estas interacciones
      interaction_subsets <- list(character(0))  # Incluir el caso sin interacciones
      if (length(possible_interactions) > 0) {
        interaction_combinations <- lapply(1:length(possible_interactions), function(i) {
          combn(possible_interactions, i, simplify = FALSE)
        }) %>% unlist(recursive = FALSE)
        interaction_subsets <- c(interaction_subsets, interaction_combinations)
      }
      
      # Para cada combinación de interacciones
      for (ints in interaction_subsets) {
        full_terms <- c(terms, ints)
        
        # Crear la fórmula del modelo y almacenarla
        formula_str <- paste(y, "~", paste(full_terms, collapse = "+"))
        formulas_list <- append(formulas_list, list(formula_str))
      }
    }
  }
  
  # Eliminar posibles duplicados de fórmulas
  formulas_list <- unique(formulas_list)
  
  # Total de modelos a ajustar
  total_models <- length(formulas_list)
  
  # Iniciar el progreso
  p <- progressor(steps = total_models)
  
  # Ajustar los modelos en paralelo usando foreach
  results_list <- foreach(i = 1:total_models, .packages = c("nnet", "MASS"), .combine = 'rbind') %dopar% {
    formula_str <- formulas_list[[i]]
    formula <- as.formula(formula_str)
    
    # Ajustar el modelo
    model <- tryCatch(
      nnet::multinom(formula, data = data, trace = FALSE),
      error = function(e) NULL,
      warning = function(w) NULL
    )
    
    # Actualizar el progreso
    p(sprintf("Ajustando modelo %d de %d", i, total_models))
    
    # Si el modelo se ajustó correctamente, almacenar los resultados
    if (!is.null(model)) {
      bic <- BIC(model)
      data.frame(
        predictors = formula_str,
        BIC = bic,
        stringsAsFactors = FALSE
      )
    } else {
      NULL
    }
  }
  
  # Convertir los resultados a dataframe y ordenar por BIC
  results_df <- as.data.frame(results_list)
  results_df <- results_df %>% arrange(BIC)
  
  return(results_df)
}


num_cores <- parallel::detectCores() - 1
cl <- makeCluster(num_cores)
registerDoParallel(cl)

#pacman job kableExtra tidyverse cluster WeightedCluster devtools TraMineR TraMineRextras NbClust haven ggseqplot gridExtra Tmisc factoextra reticulate withr rmarkdown quarto

options(knitr.kable.NA = '')


#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#
#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#

knitr::knit_hooks$set(time_it = local({
  now <- NULL
  function(before, options) {
    if (before) {
      # record the current time before each chunk
      now <<- Sys.time()
    } else {
      # calculate the time difference after a chunk
      res <- ifelse(difftime(Sys.time(), now)>(60^2),difftime(Sys.time(), now)/(60^2),difftime(Sys.time(), now)/(60^1))
      # return a character string to show the time
      x<-ifelse(difftime(Sys.time(), now)>(60^2),paste("Tiempo que demora esta sección:", round(res,1), "horas"),paste("Tiempo que demora esta sección:", round(res,1), "minutos"))
      paste('<div class="message">', gsub('##', '\n', x),'</div>', sep = '\n')
    }
  }
}))
knitr::opts_chunk$set(time_it = TRUE)

#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:
#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:

format_cells <- function(df, rows ,cols, value = c("italics", "bold", "strikethrough")){
  
  # select the correct markup
  # one * for italics, two ** for bold
  map <- setNames(c("*", "**", "~~"), c("italics", "bold", "strikethrough"))
  markup <- map[value]  
  
  for (r in rows){
    for(c in cols){
      
      # Make sure values are not factors
      df[[c]] <- as.character( df[[c]])
      
      # Update formatting
      df[r, c] <- ifelse(nchar(df[r, c])==0,"",paste0(markup, gsub(" ", "", df[r, c]), markup))
    }
  }
  
  return(df)
}
#To produce line breaks in messages and warnings
knitr::knit_hooks$set(
  error = function(x, options) {
    paste('\n\n<div class="alert alert-danger">',
          gsub('##', '\n', gsub('^##\ Error', '**Error**', x)),
          '</div>', sep = '\n')
  },
  warning = function(x, options) {
    paste('\n\n<div class="alert alert-warning">',
          gsub('##', '\n', gsub('^##\ Warning:', '**Warning**', x)),
          '</div>', sep = '\n')
  },
  message = function(x, options) {
    paste('<div class="message">',
          gsub('##', '\n', x),
          '</div>', sep = '\n')
  }
)

#_#_#_#_#_#_#_#_#_#_#_#_#_
invisible("Function to format CreateTableOne into a database")

as.data.frame.TableOne <- function(x, ...) {capture.output(print(x,showAllLevels = TRUE, varLabels = T,...) -> x)
  y <- as.data.frame(x)
  y$characteristic <- dplyr::na_if(rownames(x), "")
  y <- y %>%
    fill(characteristic, .direction = "down") %>%
    dplyr::select(characteristic, everything())
  rownames(y) <- NULL
  y}
#_#_#_#_#_#_#_#_#_#_#_#_#_
# Austin, P. C. (2009). The Relative Ability of Different Propensity 
# Score Methods to Balance Measured Covariates Between 
# Treated and Untreated Subjects in Observational Studies. Medical 
# Decision Making. https://doi.org/10.1177/0272989X09341755
smd_bin <- function(x,y){
  z <- x*(1-x)
  t <- y*(1-y)
  k <- sum(z,t)
  l <- k/2
  
  return((x-y)/sqrt(l))
  
}

#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:
#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:#:


if(.Platform$OS.type == "windows") withAutoprint({
  memory.size()
  memory.size(TRUE)
  memory.limit()
})
>   memory.size()
[1] Inf
>   memory.size(TRUE)
[1] Inf
>   memory.limit()
[1] Inf

Resultados

0.a. Historial

Tiempo que demora esta sección: 0 minutos

0.b. Descripción tiempo seguimiento

Describir censura incluyendo muerte.

Code
dt_df_filled_quarter_t_desde_primera_adm_expand$cens_time_rec<- ifelse(!is.na(dt_df_filled_quarter_t_desde_primera_adm_expand$death_time)&dt_df_filled_quarter_t_desde_primera_adm_expand$death_time<dt_df_filled_quarter_t_desde_primera_adm_expand$cens_time,
                     dt_df_filled_quarter_t_desde_primera_adm_expand$death_time,
                     dt_df_filled_quarter_t_desde_primera_adm_expand$cens_time)

psych::describe(dt_df_filled_quarter_t_desde_primera_adm_expand$cens_time_rec) %>% 
  knitr::kable("html")
vars n mean sd median trimmed mad min max range skew kurtosis se
X1 1 12371 17.85584 1.757469 18.00448 17.97795 1.412609 0.0109516 19.98672 19.97577 -4.397878 33.47011 0.015801

Tiempo que demora esta sección: 0 minutos

Ahora por mes

Code
dt_df_filled_month_t_desde_primera_adm_expand$cens_time_rec<- ifelse(!is.na(dt_df_filled_month_t_desde_primera_adm_expand$death_time)&dt_df_filled_month_t_desde_primera_adm_expand$death_time<dt_df_filled_month_t_desde_primera_adm_expand$cens_time,
                     dt_df_filled_month_t_desde_primera_adm_expand$death_time,
                     dt_df_filled_month_t_desde_primera_adm_expand$cens_time)

psych::describe(dt_df_filled_month_t_desde_primera_adm_expand$cens_time_rec) %>% 
  knitr::kable("html")
vars n mean sd median trimmed mad min max range skew kurtosis se
X1 1 14925 53.63163 5.28762 54.14485 54.0116 4.189116 0.0328549 59.96016 59.92731 -4.455774 33.91993 0.0432816

Tiempo que demora esta sección: 0 minutos

1.1. PAM (OM), sol 9 cluster

2.1. PAM (OM), sol 6 cluster- diagnósticos

Code
invisible("info de validación de modelos con bootstrap")
# PAM Trimestral= La solución de 4 y 6 o 7 cluster parecen tener buenos índices de calidad. 
# De todas formas, los índices ASW se encuentran en niveles que reflejan buena calidad, 
# 6 - 7 cluster reflejan de mejor forma las distancias entre los puntos.
# 
# Comb= ASW todos sobre umbral (density, todos sobre distribución); HC todos sobre 
# umbral (density, 7 a 10, 3 y 2 sobre el umbral); HG debajo umbral (density, 3 a 15 
# debajo distribución, 2 en distribución); PBC debajo umbral (density, 12 y 13 en distribución
# , 14 y 15 sobre, 2 a 11, debajo)
# Seq= ASW todos sobre umbral (2 en distribución, 3 en adelante, sobre distribución); 
# HC 2 a 9 sobre umbral (density, todos debajo); 6 en adelante sobre umbral HG 
# (density, 5 en adelante sobre distribución, resto en distribución); PBC sobre umbral 
# desde 5 en adelante (density, sobre distribución desde 6 en adelante) 
# 6 EN ADELANTE PODRÍA SER DISTINTO A NULO
# 
invisible("Hacemos clasificación de pertenencia cluster y ponemos etiquetas")
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$clus_pam <-
  factor(pamRange_quarter_om$clustering$cluster6,levels=rev(attr( sort(table(pamRange_quarter_om$clustering$cluster6)), "name")),
         labels= c("6035_Un evento, TSM", "6025_Un evento, TUS", "5939_Un evento TSM larga duración", "5989_Un evento, comorbilidad", "6036_TSM, 1 año después, otras causas", "5710_TSM, 1 año después, TSM"))

Tiempo que demora esta sección: 0 minutos

Vemos los diagnósticos que vienen después de aquellos cluster con más de un ingreso.

Code
diag_6036<-
df_filled %>% 
  dplyr::filter(run %in% subset(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens, clus_pam=="6036_TSM, 1 año después, otras causas")$run) %>% 
  dplyr::select(run, diag1, diag2, diag3, diag4, diag5, diag6, diag7, diag8, diag9, diag10, diag11, fecha_egreso_rec_fmt, estab_homo) %>% 
  dplyr::group_by(run) %>%
  dplyr::filter(row_number() != 1) %>%  # Elimina la primera observación de cada run
  dplyr::mutate(
    all_diags = paste(na.omit(c(diag1, diag2, diag3, diag4, diag5, diag6, diag7, diag8, diag9, diag10, diag11)), collapse = ", ")
  ) %>%
  dplyr::summarise(
    all_diags = first(all_diags),
    fecha_egreso_rec_fmt = first(fecha_egreso_rec_fmt),
    estab_homo = first(estab_homo)
  ) %>%
  dplyr::ungroup() %>% 
  dplyr::pull(all_diags) %>%  # Extraer la columna all_diags como vector
  strsplit(split = ", ") %>%  # Separar cada diagnóstico por comas
  unlist()  # Convertir la lista en un vector
# 1. **F192** (25, 2.96%): Trastorno mental y del comportamiento debido al uso de múltiples drogas y al uso de otras sustancias psicoactivas, síndrome de abstinencia.
# 2. **F609** (17, 2.01%): Trastorno específico de la personalidad no especificado.
# 3. **O800** (17, 2.01%): Parto espontáneo por vía vaginal.
# 4. **F603** (16, 1.89%): Trastorno de la personalidad emocionalmente inestable, tipo impulsivo.
# 5. **E101** (15, 1.77%): Diabetes mellitus insulino-dependiente, no controlada.
# 6. **Z370** (14, 1.65%): Nacimiento de un solo feto nacido vivo.
# 7. **F322** (13, 1.54%): Episodio depresivo grave sin síntomas psicóticos.
# 8. **G409** (13, 1.54%): Epilepsia, no especificada.
# 9. **N390** (13, 1.54%): Infección del tracto urinario, sitio no especificado.
# 10. **Z518** (13, 1.54%): Otras atenciones médicas especificadas.
# 11. **T509** (10, 1.18%): Envenenamiento por otros psicotrópicos y sustancias psicotrópicas no especificadas.
# 12. **G629** (8, 0.95%): Polineuropatía, no especificada.
# 13. **K358** (8, 0.95%): Apendicitis crónica.
# 14. **N10X** (8, 0.95%): Nefritis tubulointersticial aguda.
# 15. **O829** (8, 0.95%): Parto por cesárea no especificado.
# 16. **F191** (7, 0.83%): Trastorno mental y del comportamiento debido al uso de múltiples drogas y al uso de otras sustancias psicoactivas, dependencia actual.
# 17. **F329** (7, 0.83%): Episodio depresivo no especificado.
# 18. **Z291** (7, 0.83%): Asesoramiento sobre la prevención del abuso de sustancias psicoactivas.
# 19. **F199** (6, 0.71%): Trastorno mental y del comportamiento debido al uso de múltiples drogas y al uso de otras sustancias psicoactivas, no especificado.
# 20. **K808** (6, 0.71%): Cálculo de la vesícula biliar sin colecistitis.
# 21. **O470** (6, 0.71%): Falso trabajo de parto.
# 22. **O809** (6, 0.71%): Parto por vía vaginal no especificado.
# 23. **O821** (5, 0.59%): Parto por cesárea electiva.
# 24. **R458** (5, 0.59%): Otros síntomas y signos que involucran el estado emocional.
# 25. **X590** (5, 0.59%): Exposición a otros factores no especificados.
# 26. **Z910** (5, 0.59%): Antecedentes personales de riesgo no especificado.
# 
invisible("6035 (n=4476): trayectoria con sólo un evento hosp por TSM")
invisible("6025 (n=680): trayectoria con sólo un evento hosp. con TUS")
invisible("5939 (n=319): trayectoria con 2 trimestres continuis por morbilidad psiquiátrica")
invisible("5989 (n=207): trayectoria de sólo un evento en por comorbilidad")
invisible("6036 (n=202): trayectoria de morbilidad, pero a los 4 trimestres posteriores tienen ingresos por otras causas")

invisible("cuáles son esas causas principalmente??, son distintas de las que tiene la población?")
invisible("5710 (n=154): trayectoria de morbilidad, pero a los 4 trimestres posteriores tienen ingresos por morbilidad")
invisible("qué morbilidad principalmente??, son distintas de las que tiene la población?")

Tiempo que demora esta sección: 0 minutos

Code
diag_5710<-
  df_filled %>% 
  dplyr::filter(run %in% subset(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens, clus_pam=="5710_TSM, 1 año después, TSM")$run) %>% 
  dplyr::select(run, diag1, diag2, diag3, diag4, diag5, diag6, diag7, diag8, diag9, diag10, diag11, fecha_egreso_rec_fmt, estab_homo) %>% 
  dplyr::group_by(run) %>%
  dplyr::filter(row_number() != 1) %>%  # Elimina la primera observación de cada run
  dplyr::mutate(
    all_diags = paste(na.omit(c(diag1, diag2, diag3, diag4, diag5, diag6, diag7, diag8, diag9, diag10, diag11)), collapse = ", ")
  ) %>%
  dplyr::summarise(
    all_diags = first(all_diags),
    fecha_egreso_rec_fmt = first(fecha_egreso_rec_fmt),
    estab_homo = first(estab_homo)
  ) %>%
  dplyr::ungroup() %>% 
  dplyr::pull(all_diags) %>%  # Extraer la columna all_diags como vector
  strsplit(split = ", ") %>%  # Separar cada diagnóstico por comas
  unlist()  # Convertir la lista en un vector
# 
# 1. **F603** (71, 5.97%): Trastorno de la personalidad emocionalmente inestable, tipo impulsivo.
# 2. **F609** (54, 4.54%): Trastorno específico de la personalidad no especificado.
# 3. **F329** (51, 4.29%): Episodio depresivo no especificado.
# 4. **F322** (47, 3.95%): Episodio depresivo grave sin síntomas psicóticos.
# 5. **F319** (43, 3.61%): Trastorno depresivo recurrente, episodio no especificado.
# 6. **F209** (42, 3.53%): Esquizofrenia, no especificada.
# 7. **F200** (40, 3.36%): Esquizofrenia paranoide.
# 8. **F192** (33, 2.77%): Trastorno mental y del comportamiento debido al uso de múltiples drogas y al uso de otras sustancias psicoactivas, síndrome de abstinencia.
# 9. **C490** (29, 2.44%): Tumor maligno de tejido mesotelial y tejido blando, sitio no especificado.
# 10. **G909** (21, 1.76%): Trastorno no especificado del sistema nervioso autónomo.
# 11. **Z511** (20, 1.68%): Atención para tratamiento de tumores malignos.
# 12. **F432** (17, 1.43%): Reacción de estrés agudo.
# 13. **F431** (16, 1.34%): Trastorno de estrés postraumático.
# 14. **F449** (15, 1.26%): Trastorno de ansiedad no especificado.
# 15. **F070** (14, 1.18%): Trastornos orgánicos de la personalidad.
# 16. **Z915** (14, 1.18%): Historia personal de lesión autoinfligida.
# 17. **F191** (12, 1.01%): Trastorno mental y del comportamiento debido al uso de múltiples drogas y al uso de otras sustancias psicoactivas, dependencia actual.
# 18. **E669** (11, 0.92%): Obesidad no especificada.
# 19. **T424** (11, 0.92%): Intoxicación por otros psicotrópicos.
# 20. **F608** (10, 0.84%): Otros trastornos específicos de la personalidad.
# 21. **G409** (10, 0.84%): Epilepsia, no especificada.

Tiempo que demora esta sección: 0 minutos

Luego vemos la clasificación de PPOO por cluster

Code
janitor::chisq.test(df_filled[,c("run","glosa_pueblo_originario")] %>% 
        dplyr::left_join(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens[,c("run", "clus_pam")], by="run", multiple="first") %>% 
        janitor::tabyl(glosa_pueblo_originario, clus_pam))

    Pearson's Chi-squared test

data:  df_filled[, c("run", "glosa_pueblo_originario")] %>% dplyr::left_join(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens[,     c("run", "clus_pam")], by = "run", multiple = "first") %>%     janitor::tabyl(glosa_pueblo_originario, clus_pam)
X-squared = 187.03, df = 40, p-value < 2.2e-16

Tiempo que demora esta sección: 0 minutos

Generamos un gráfico de PPOO por cada conglomerado.

Code
ppoo_clus<-
  df_filled[,c("run","glosa_pueblo_originario")] %>% 
  dplyr::left_join(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens[,c("run", "clus_pam","factor_inclusivo_real_hist_mas_autperc")], by="run", multiple="first") %>% 
  dplyr::mutate(glosa_pueblo_originario_rec= dplyr::case_when(glosa_pueblo_originario=="NINGUNO" & factor_inclusivo_real_hist_mas_autperc!="00"~ "DESCONOCIDO", T~glosa_pueblo_originario)) %>% 
  janitor::tabyl(glosa_pueblo_originario_rec, clus_pam) %>% 
  janitor::adorn_percentages("row")

reshape2::melt(ppoo_clus, id.vars = "glosa_pueblo_originario_rec") %>% 
  dplyr::mutate(glosa_pueblo_originario_rec= 
    dplyr::recode(glosa_pueblo_originario_rec, 
      "OTRO (ESPECIFICAR)"="OTRO(n=77)", 
      "RAPA NUI (PASCUENSE)"="RAPA NUI(n=34)", 
      "YAGÁN (YÁMANA)"="YAGÁN(n=2)",
      "AYMARA"="AYMARA(n=13)",
      "COLLA"="COLLA(n=6)",
      "DIAGUITA"="DIAGUITA(n=3)",
      "KAWÉSQAR"="KAWÉSQAR(n=4)",
      "MAPUCHE"="MAPUCHE(n=255)",
      "DESCONOCIDO"=".DESCONOCIDO(n=1.985)",
      "NINGUNO"=".NINGUNO(n=9.156)")) %>% 
  #dplyr::filter(glosa_pueblo_originario!="NINGUNO") %>% 
  # dplyr::mutate(variable= 
  #   dplyr::recode(variable, "6036_TSM, 1 año después, otras causas"="6036_TSM, 1 año\ndespués, otras causas",
  #                  "5710_TSM, 1 año después, TSM"="5710_TSM, 1 año\ndespués, TSM",
  #                 "5939_Un evento TSM larga duración"="5939_Un evento TSM\nlarga duración",
  #                 "5989_Un evento, comorbilidad"="5989_Un evento,\ncomorbilidad")) %>% 
ggplot(aes(x = glosa_pueblo_originario_rec, y = value, fill = variable)) + 
  geom_bar(stat = "identity", position = "fill") + 
  scale_fill_manual(values = c("#E27A5B","#6B8E23", "#D2B48C", "#696969", "#BDB76B", "#4682B4")) +
  labs(title = NULL,
       x = "Grupo Étnico",
       y = "Proporción de Casos",
       fill = "Grupos") +  # Cambia el título de la leyenda a "Grupos"
  theme_minimal() +
  theme(
    axis.text.y = element_text(size = 12),           # Tamaño de las etiquetas de los grupos étnicos
    axis.text.x = element_text(size = 12),           # Tamaño de las etiquetas del eje X
    axis.title.x = element_text(size = 14),          # Tamaño del título del eje X
    axis.title.y = element_text(size = 14),          # Tamaño del título del eje Y
    plot.title = NULL,  # Tamaño y estilo del título del gráfico
    legend.title = element_text(size = 14, margin = margin(b = -.1)),          # Tamaño del título de la leyenda
    legend.spacing.y = unit(1.5, "lines"),
    legend.box.spacing = unit(0.5, "lines"),      # Controla el espacio entre la leyenda y el gráfico
    legend.margin = margin(5, 5, 5, 5),  
    legend.key.height = unit(1, "cm"),  
    legend.text = element_text(size = 12)            # Tamaño del texto de la leyenda
    ) + 
  coord_flip()  # Hacer el gráfico horizontal
ggsave("grafico_ancho_achatado.png", width = 8, height = 3, dpi=1000)
PPOO por cluster

PPOO por cluster

Tiempo que demora esta sección: 0 minutos

Vemos los gráficos de las trayectorias

Code
categories<-attr(States_Wide.seq_quarter_t_prim_adm_cens, "labels")
new_labels <- categories
new_labels[which(categories == "Otras causas")] <- "Otras\ncausas"
#new_labels[which(categories == "Consumo\nde sustancias")] <- "Consumo de\nsustancias"



seq_plot <- ggseqiplot(States_Wide.seq_quarter_t_prim_adm_cens, 
                       group=factor(pamRange_quarter_om$clustering$cluster6,levels=rev(attr( sort(table(pamRange_quarter_om$clustering$cluster6)), "name"))), 
                       facet_ncol=3, facet_nrow=3) +
  theme(legend.position = "none")+
  labs(x="Trimestres", y="# IDs de usuarios")+
  #guides(fill = guide_legend(nrow = 1))+
    theme(
    axis.text.y = element_text(size = 15),           # Tamaño de las etiquetas de los grupos étnicos
    axis.text.x = element_text(size = 15),           # Tamaño de las etiquetas del eje X
    axis.title.x = element_text(size = 15),          # Tamaño del título del eje X
    axis.title.y = element_text(size = 15, margin = margin(r = -10)),#,margin = margin(l = -10)),
    strip.text = element_text(size = 16, margin = margin(b =-15)),
    legend.text = element_text(size = 15),
    legend.spacing.x = unit(0.1, 'cm'),  # Alinea el título de la leyenda hacia la izquierda
    legend.box.margin = margin(t = 0, r = 0, b = 0, l = -50),
    legend.position = "bottom", 
    legend.justification = "left",
    panel.spacing.y = unit(0.5, "lines")
    #legend.key.size = unit(1.5, "lines"),        # Aumenta el tamaño de los símbolos en la leyenda
  )+
  guides(fill = guide_legend(nrow = 1)) +
  scale_fill_manual(labels = new_labels, values=c("#E2725B", "#556B2F", "#D2B48C",#"#8B4513",
                                                  "#FFFFFF","#808080","#000000"))
seq_plot
ggsave(filename="clusterspam_om6_mod.png",seq_plot,  width = 8.5, height = 5.5, dpi=1000)
Trayectorias de hospitalización, orden de sujetos según el primer estado observado y su duración, representando a cada individuo como una línea en el gráfico.

Trayectorias de hospitalización, orden de sujetos según el primer estado observado y su duración, representando a cada individuo como una línea en el gráfico.

Tiempo que demora esta sección: 0.4 minutos

Code
seq_plot2 <-ggseqdplot(States_Wide.seq_quarter_t_prim_adm_cens, 
                       group=factor(pamRange_quarter_om$clustering$cluster6,levels=rev(attr( sort(table(pamRange_quarter_om$clustering$cluster6)), "name"))), 
                       facet_ncol=3, facet_nrow=3) +
  theme(legend.position = "none")+  # Colocar la leyenda abajo
  labs(x="Trimestres", y="Frecuencia relativa de estados")+
  theme(
    axis.text.y = element_text(size = 15),           # Tamaño de las etiquetas de los grupos étnicos
    axis.text.x = element_text(size = 15),           # Tamaño de las etiquetas del eje X
    axis.title.x = element_text(size = 15),          # Tamaño del título del eje X
    axis.title.y = element_text(size = 15, margin = margin(r = -5)),
    strip.text = element_text(size = 15),
    panel.spacing.y = unit(0.5, "lines")
  )  # Colocar la leyenda abajo
seq_plot2
ggsave("clusterspam_om62_mod.png",seq_plot2, width = 8, height = 5.5, dpi=1000)
Trayectorias de hospitalización, frecuencia relativa de estados en un gráfico de barras apiladas por trimestre.

Trayectorias de hospitalización, frecuencia relativa de estados en un gráfico de barras apiladas por trimestre.

Tiempo que demora esta sección: 0.1 minutos

De este modo, presenta el cambio agregado en la distribución de estados a lo largo del tiempo, sin considerar las secuencias individuales.

2.1.1.Exploración transiciones

2.1.1.a Transiciones- RM y no RM

Tasas de transición no RM a RM y viceversa

Code
invisible("Tasas de transición no RM a RM y viceversa")

trim_tasa_pam_clus6_cens_cnt<-  
  seqcount_t(States_Wide.seq_quarter_t_prim_adm_RM_cens, 
             group=factor(pamRange_quarter_om$clustering$cluster6,levels=rev(attr( sort(table(pamRange_quarter_om$clustering$cluster6)), "name")))) %>% 
  dplyr::filter(count>0) %>% 
  dplyr::mutate(trans = paste0(from,"_", to)) %>% 
  dplyr::mutate(across(c("from","to"),~  gsub("\\[->\\s*|\\s*->\\s*\\]|\\[|\\]", "", .))) 
trim_tasa_pam_clus6_cens_rate<-  
  seqtrate_t(States_Wide.seq_quarter_t_prim_adm_RM_cens, 
             group=factor(pamRange_quarter_om$clustering$cluster6,levels=rev(attr( sort(table(pamRange_quarter_om$clustering$cluster6)), "name")))) %>% 
  dplyr::filter(rate>0) %>% 
  dplyr::mutate(trans = paste0(from,"_", to)) %>% 
  dplyr::mutate(across(c("from","to"),~  gsub("\\[->\\s*|\\s*->\\s*\\]|\\[|\\]", "", .)))

Tiempo que demora esta sección: 0 minutos

Code
trim_tasa_pam_clus6_cens_rate %>%   
  dplyr::left_join(trim_tasa_pam_clus6_cens_cnt, by=c("from"="from", "glosa_sexo"="glosa_sexo","to"="to")) %>% 
  dplyr::rename("recuento"="count") %>% 
  dplyr::filter(from %in% c("RM", "noRM")) %>%  
  dplyr::mutate(glosa_sexo= factor(glosa_sexo,levels=rev(attr( sort(table(pamRange_quarter_om$clustering$cluster6)), "name")))) %>%
  ggplot(aes(x = from, y = to, fill = rate, size=log(recuento+1))) +
  geom_tile() +
  coord_flip()+
  scale_fill_gradient(low = "white", high = "blue") + # Ajusta la escala de colores según tus preferencias
  labs(title = "Tasas de transición, Trimestre (s/censura)",
       x = "Desde",
       y = "Hacia",
       fill = "Rate") +
  theme_minimal() +
  facet_wrap(~glosa_sexo)+
  theme(axis.text.x = element_text(angle = 45, hjust = 1))+
  geom_text(aes(label = sprintf("%1.2f", rate), size =log(recuento+1)*.5), color = "black")

invisible("Hay muy pocos casos que se entrecruzan entre noRM y RM (fuera de la diagnonal)")
Porcentajes de transición no-RM y RM por cada cluster

Porcentajes de transición no-RM y RM por cada cluster

Tiempo que demora esta sección: 0.1 minutos

Hay muy pocos casos que se entrecruzan entre noRM y RM (fuera de la diagnonal)

2.1.1.b Transiciones
Code
trim_tasa2_pam_clus6_cens_cnt<-  
  seqcount_t(States_Wide.seq_quarter_t_prim_adm_cens, 
             group=factor(pamRange_quarter_om$clustering$cluster6,levels=rev(attr( sort(table(pamRange_quarter_om$clustering$cluster6)), "name")))) %>% 
  dplyr::filter(count>0) %>% 
  dplyr::mutate(trans = paste0(from,"_", to)) %>% 
  dplyr::mutate(across(c("from","to"),~  gsub("\\[->\\s*|\\s*->\\s*\\]|\\[|\\]", "", .))) 
trim_tasa2_pam_clus6_cens_rate<-  
  seqtrate_t(States_Wide.seq_quarter_t_prim_adm_cens, 
             group=factor(pamRange_quarter_om$clustering$cluster6,levels=rev(attr( sort(table(pamRange_quarter_om$clustering$cluster6)), "name")))) %>% 
  dplyr::filter(rate>0) %>% 
  dplyr::mutate(trans = paste0(from,"_", to)) %>% 
  dplyr::mutate(across(c("from","to"),~  gsub("\\[->\\s*|\\s*->\\s*\\]|\\[|\\]", "", .)))

Tiempo que demora esta sección: 0 minutos

Code
trim_tasa2_pam_clus6_cens_rate %>%   
  dplyr::left_join(trim_tasa2_pam_clus6_cens_cnt, by=c("from"="from", "glosa_sexo"="glosa_sexo","to"="to")) %>% 
  dplyr::rename("recuento"="count") %>% 
  #dplyr::filter(from %in% c("RM", "noRM")) %>%  
  dplyr::mutate(glosa_sexo= factor(glosa_sexo,levels=rev(attr( sort(table(pamRange_quarter_om$clustering$cluster6)), "name")))) %>%
  ggplot(aes(x = from, y = to, fill = rate, size=log(recuento+1))) +
  geom_tile() +
  coord_flip()+
  scale_fill_gradient(low = "white", high = "blue") + # Ajusta la escala de colores según tus preferencias
  labs(title = "Tasas de transición, Trimestre (s/censura)",
       x = "Desde",
       y = "Hacia",
       fill = "Rate") +
  theme_minimal() +
  facet_wrap(~glosa_sexo)+
  theme(axis.text.x = element_text(angle = 45, hjust = 1))+
  geom_text(aes(label = sprintf("%1.2f", rate), size =log(recuento+1)*.5), color = "black")
Porcentajes de transición no-RM y RM por cada cluster

Porcentajes de transición no-RM y RM por cada cluster

Tiempo que demora esta sección: 0.3 minutos

2.1.1.c Tiempo promedio por cluster
Code
seq_mean_t(States_Wide.seq_quarter_t_prim_adm_cens, 
           factor(pamRange_quarter_om$clustering$cluster6,levels=rev(attr( sort(table(pamRange_quarter_om$clustering$cluster6)), "name"))))%>% 
  data.table::as.data.table(keep.rowname=T) %>% 
  ggplot(aes(x=rn, fill= factor_inclusivo, y=Mean))+
  geom_bar(width = 1, stat = "identity") +
  theme_minimal() +
  labs(title = NULL,
       x = NULL,
       y = NULL) +
  coord_flip()+
  theme(#axis.text.x = element_blank(),
    #axis.text.y = element_blank(),
    panel.grid = element_blank()) +
#  scale_fill_brewer(palette = "Pastel1", labels=c("Sin\nautoidentificación\nni reconocimiento", "Autoidentificación\nsin reconocimiento", "Ambas")) +
  geom_text(aes(label = round(Mean,1)), 
            position = position_stack(vjust = 0.5), 
            size = 2.5, # Ajusta el tamaño de la fuente aquí
            color = "black", # Color del texto
            family = "sans", # Puedes cambiar la fuente si lo deseas
            background = element_rect(fill = "white", color = NA)) + # Fondo blanco
  theme(legend.title = element_blank())

invisible("No me aporta mucho")
# seq_mean_t_dos_grupos(States_Wide.seq_quarter_t_prim_adm_cens, group1=ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$clus_pam, group2=ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$factor_inclusivo_real_hist_mas_autperc)
Tiempo promedio en cada estado por estatus PPOO (Trimestral c/censura)

Tiempo promedio en cada estado por estatus PPOO (Trimestral c/censura)

Tiempo que demora esta sección: 0.1 minutos

2.1.2. Propiedades secuencias

Vemos el número de transiciones, número de subsecuencias y la entropía

Code
## number of transitions 
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$ntrans <- as.numeric(seqtransn(States_Wide.seq_quarter_t_prim_adm))
## number of subsequences
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$subsn  <- as.numeric(seqsubsn(States_Wide.seq_quarter_t_prim_adm))

ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$entropy_long <- as.numeric(seqient(States_Wide.seq_quarter_t_prim_adm))


ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
  dplyr::group_by(clus_pam) %>% 
  dplyr::summarise(promedio_entropia= mean(entropy_long), 
                   mediana_entropia= quantile(entropy_long, .5),
                   p25_entropia= quantile(entropy_long, .25),
                   p75_entropia= quantile(entropy_long, .75),
                   promedio_n_trans= mean(ntrans), #Las transiciones se refieren a los cambios de estado en las secuencias.
                   sd_n_trans= sd(ntrans), #subsecuencia es una parte de una secuencia más larga que respeta el orden temporal original, 
                   #pero no necesariamente contiene todos los estados
                   promedio_subsn= mean(subsn), 
                   sd_subsn= sd(subsn)) %>% 
  dplyr::mutate_if(is.numeric, ~ sprintf("%1.2f", .)) %>% 
  knitr::kable("html", col.names = c("Cluster", "Promedio Entropía", "Mediana Entropía", "Entropía Percentil 25", "Entropía Percentil 75", "Promedio Número de Transiciones", "Desviación Estándar Número de Transiciones", "Promedio Número de Subsecuencias", "Desviación Estándar Número de Subsecuencias"), caption="Resumen de Métricas por Cluster")
Resumen de Métricas por Cluster
Cluster Promedio Entropía Mediana Entropía Entropía Percentil 25 Entropía Percentil 75 Promedio Número de Transiciones Desviación Estándar Número de Transiciones Promedio Número de Subsecuencias Desviación Estándar Número de Subsecuencias
6035_Un evento, TSM 0.16 0.12 0.12 0.20 1.71 1.20 9.38 46.91
6025_Un evento, TUS 0.18 0.12 0.12 0.25 1.78 1.34 10.95 27.85
5939_Un evento TSM larga duración 0.28 0.26 0.20 0.32 2.24 1.68 17.64 52.58
5989_Un evento, comorbilidad 0.20 0.12 0.12 0.25 2.00 1.39 13.92 41.49
6036_TSM, 1 año después, otras causas 0.33 0.32 0.25 0.38 4.35 1.63 50.74 76.27
5710_TSM, 1 año después, TSM 0.37 0.38 0.27 0.43 4.62 1.99 57.57 83.32

Tiempo que demora esta sección: 0 minutos

2.1.3. Comparación variables

2.1.3.a. Comparación covariables- PPOO
Code
round(
prop.table(table(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$clus_pam, 
                 ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$factor_inclusivo_real_hist_mas_autperc),1),
2)

ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>%
  count(clus_pam, factor_inclusivo_real_hist_mas_autperc) %>%
  group_by(clus_pam) %>%
  mutate(prop = scales::percent(n / sum(n))) %>%
  select(-n) %>%
  pivot_wider(names_from = factor_inclusivo_real_hist_mas_autperc, values_from = prop, values_fill = "0") %>% knitr::kable("markdown", col.names=c("Conglomerados","No se identifica/no pertenece", "No se identifica/hay reconocimiento", "Se identifica/hay reconocimeinto"), caption="Porcentajes por fila, conglomerado vs. Pertenencia/identificación + Reconocimento CONADI PPOO")
#        00   10   11
# 6035 0.81 0.11 0.08
# 6025 0.79 0.12 0.10
# 5939 0.83 0.11 0.07
# 5989 0.84 0.09 0.08
# 6036 0.80 0.11 0.09
# 5710 0.79 0.12 0.09
invisible("6025 tiwnw un poxo mas PPOO, lo mismo con 5710")
                                       
                                          00   10   11
  6035_Un evento, TSM                   0.81 0.11 0.08
  6025_Un evento, TUS                   0.79 0.12 0.10
  5939_Un evento TSM larga duración     0.83 0.11 0.07
  5989_Un evento, comorbilidad          0.84 0.09 0.08
  6036_TSM, 1 año después, otras causas 0.80 0.11 0.09
  5710_TSM, 1 año después, TSM          0.79 0.12 0.09
Porcentajes por fila, conglomerado vs. Pertenencia/identificación + Reconocimento CONADI PPOO
Conglomerados No se identifica/no pertenece No se identifica/hay reconocimiento Se identifica/hay reconocimeinto
6035_Un evento, TSM 80.6% 11.2% 8.2%
6025_Un evento, TUS 78.5% 11.6% 9.9%
5939_Un evento TSM larga duración 82.8% 10.7% 6.6%
5989_Un evento, comorbilidad 83.57% 8.70% 7.73%
6036_TSM, 1 año después, otras causas 79.7% 11.4% 8.9%
5710_TSM, 1 año después, TSM 79.2% 11.7% 9.1%

Tiempo que demora esta sección: 0 minutos

Vemos las categorías de clasificación de PPOO según autopercepción (en MINSAL y en RSH) y reconocimiento CONADI.

Code
table(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$factor_inclusivo_real_hist_mas_autperc)

  00   10   11 
4863  672  503 

Tiempo que demora esta sección: 0 minutos

Code
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
    dplyr::mutate(death_time_rec=ifelse(death_time==20,0,1)) %>% 
    janitor::tabyl(factor_inclusivo_real_hist_mas_autperc,clus_pam) %>%
    janitor::chisq.test()
#X-squared = 5.6334, df = 10, p-value = 0.8451
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
    dplyr::mutate(death_time_rec=ifelse(death_time==20,0,1)) %>% 
    janitor::tabyl(factor_inclusivo_real_hist_mas_autperc,clus_pam) %>%
    janitor::fisher.test(simulate.p.value=T, B=1e5)
# data:  .
# p-value = 0.8467
# alternative hypothesis: two.sided

    Pearson's Chi-squared test

data:  .
X-squared = 5.6334, df = 10, p-value = 0.8451


    Fisher's Exact Test for Count Data with simulated p-value (based on
    1e+05 replicates)

data:  .
p-value = 0.8465
alternative hypothesis: two.sided

Tiempo que demora esta sección: 0 minutos

Ahora lo hacemos con la versión binarizada

Code
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$factor_inclusivo_real_hist_mas_autperc_bin<- ifelse(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$factor_inclusivo_real_hist_mas_autperc=="00",0,1)

ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
    dplyr::mutate(death_time_rec=ifelse(death_time==20,0,1)) %>% 
    janitor::tabyl(factor_inclusivo_real_hist_mas_autperc_bin,clus_pam) %>%
    janitor::chisq.test()
#X-squared = 4.2566, df = 5, p-value = 0.5131

    Pearson's Chi-squared test

data:  .
X-squared = 4.2566, df = 5, p-value = 0.5131

Tiempo que demora esta sección: 0 minutos

Code
round(prop.table(table(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$clus_pam, 
                 ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$factor_inclusivo_real_hist_mas_autperc_bin),1),2) %>% knitr::kable("markdown", col.names=c("Conglomerados","No se identifica/no pertenece", "Se identifica/pertenece"), caption="Porcentajes por fila, conglomerado vs. Pertenencia/identificación PPOO")
Porcentajes por fila, conglomerado vs. Pertenencia/identificación PPOO
Conglomerados No se identifica/no pertenece Se identifica/pertenece
6035_Un evento, TSM 0.81 0.19
6025_Un evento, TUS 0.79 0.21
5939_Un evento TSM larga duración 0.83 0.17
5989_Un evento, comorbilidad 0.84 0.16
6036_TSM, 1 año después, otras causas 0.80 0.20
5710_TSM, 1 año después, TSM 0.79 0.21

Tiempo que demora esta sección: 0 minutos

Hicimos una prueba post-hoc usando Bonferroni

Code
# 
# Beasley, T. M., & Schumacker, R. E. (1995). Multiple Regression Approach to Analyzing Contingency
# Tables: Post Hoc and Planned Comparison Procedures. The Journal of Experimental Education, 64(1), 79–93. https://doi.org/10.1080/00220973.1995.9943797

chisq.posthoc.test(table(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$clus_pam, 
                         ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$factor_inclusivo_real_hist_mas_autperc_bin), method = "bonferroni") %>% 
    pivot_longer(cols = c(`0`, `1`), names_to = "Group", values_to = "Values") %>%
    pivot_wider(names_from = Value, values_from = Values) %>%
    separate(Dimension, into = c("Code", "Evento"), sep = "_", extra = "merge") %>%
    dplyr::filter(Group==1) %>%
    dplyr::mutate(Residuals= sprintf("%1.2f", Residuals)) %>% 
    select(Code, Evento, Residuals, `p values`) %>% 
  knitr::kable("markdown", col.names=c("Código","Descripción", "Residuos", "Sig."), caption="Post-hoc, conglomerado vs. Pertenencia/identificación PPOO")
Post-hoc, conglomerado vs. Pertenencia/identificación PPOO
Código Descripción Residuos Sig.
6035 Un evento, TSM -0.30 1
6025 Un evento, TUS 1.41 1
5939 Un evento TSM larga duración -1.03 1
5989 Un evento, comorbilidad -1.12 1
6036 TSM, 1 año después, otras causas 0.31 1
5710 TSM, 1 año después, TSM 0.42 1

Tiempo que demora esta sección: 0 minutos

2.1.3.b. Comparación covariables- Mortalidad
Code
# 
invisible("No hay nada, el tiempo promedio de censura es similar")

ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
  dplyr::mutate(death_time_rec=ifelse(death_time==20,0,1)) %>% 
  janitor::tabyl(clus_pam,death_time_rec) %>% 
  janitor::adorn_percentages("row")%>%
  dplyr::mutate(`1`=scales::percent(`1`, accuracy=.1)) %>% 
  dplyr::left_join(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
  dplyr::group_by(clus_pam) %>% 
  dplyr::summarise(mean=sprintf("%1.1f",mean(cens_time))), by="clus_pam") %>% 
  dplyr::select(-`0`) %>% 
  knitr::kable("markdown", col.names=c("Conglomerado","Mortalidad observada", "Promedio"), caption="Post-hoc, conglomerado vs. Pertenencia/identificación PPOO")
Post-hoc, conglomerado vs. Pertenencia/identificación PPOO
Conglomerado Mortalidad observada Promedio
6035_Un evento, TSM 0.9% 17.9
6025_Un evento, TUS 1.9% 18.2
5939_Un evento TSM larga duración 2.2% 18.0
5989_Un evento, comorbilidad 1.9% 18.1
6036_TSM, 1 año después, otras causas 1.0% 17.8
5710_TSM, 1 año después, TSM 1.9% 18.1

Tiempo que demora esta sección: 0 minutos

Code
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
             dplyr::mutate(death_time_rec=ifelse(death_time==20,0,1)) %>% 
             janitor::tabyl(death_time_rec,clus_pam) %>% 
              janitor::chisq.test(correct=T)
#X-squared = 10.621, df = 5, p-value = 0.05943


ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
             dplyr::mutate(death_time_rec=ifelse(death_time==20,0,1)) %>% 
             janitor::tabyl(death_time_rec,clus_pam) %>% 
              janitor::fisher.test(simulate.p.value=T, B=1e5)
#p-value = 0.03169
invisible("no se basa en la distribución chi-cuadrado. Fisher se basa en permutaciones exactas, por lo que no se calculan df.")

invisible("Podría haber algo aquí, aunque son números pequeños")
invisible("6036 (morbilidad y a los 4 meses otras causas) y 6035 (sólo un evento por trno.SM) tienen un 1% de gente que muere antes")
invisible("5939 (dos semestres continuos por morbilidad psiquiátrica) en cambio, tiene 2.2%")

#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_
##_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_#_
tabla_cluster_mortalidad<- 
  ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
  dplyr::mutate(death_time_rec=ifelse(death_time==20,0,1))

chisq.posthoc.test(table(tabla_cluster_mortalidad$clus_pam,
                         tabla_cluster_mortalidad$death_time_rec))%>% 
    pivot_longer(cols = c(`0`, `1`), names_to = "Group", values_to = "Values") %>%
    pivot_wider(names_from = Value, values_from = Values) %>%
    separate(Dimension, into = c("Code", "Evento"), sep = "_", extra = "merge") %>%
    dplyr::filter(Group==1) %>%
    dplyr::mutate(Residuals= sprintf("%1.2f", as.numeric(Residuals))) %>% 
    select(Code, Evento, Residuals, `p values`) %>% 
  knitr::kable("markdown", col.names=c("Código","Descripción", "Residuos", "Sig."), caption="Post-hoc, conglomerado vs. mortalidad")

    Pearson's Chi-squared test

data:  .
X-squared = 10.621, df = 5, p-value = 0.05943


    Fisher's Exact Test for Count Data with simulated p-value (based on
    1e+05 replicates)

data:  .
p-value = 0.03191
alternative hypothesis: two.sided
Post-hoc, conglomerado vs. mortalidad
Código Descripción Residuos Sig.
6035 Un evento, TSM -2.99 0.0335*
6025 Un evento, TUS 1.95 0.6201
5939 Un evento TSM larga duración 1.77 0.9118
5989 Un evento, comorbilidad 1.06 1
6036 TSM, 1 año después, otras causas -0.23 1
5710 TSM, 1 año después, TSM 0.93 1

Tiempo que demora esta sección: 0 minutos

2.1.3.c. Comparación covariables- no RM vs. RM
Code
round(
  prop.table(table(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$clus_pam, 
                   ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$codigo_region_rec_base),1),
  2) %>% 
  knitr::kable("markdown", caption="Porcentajes por fila")
Porcentajes por fila
noRM RM
6035_Un evento, TSM 0.54 0.46
6025_Un evento, TUS 0.63 0.37
5939_Un evento TSM larga duración 0.50 0.50
5989_Un evento, comorbilidad 0.42 0.58
6036_TSM, 1 año después, otras causas 0.50 0.50
5710_TSM, 1 año después, TSM 0.50 0.50

Tiempo que demora esta sección: 0 minutos

Code
janitor::chisq.test(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
                      janitor::tabyl(codigo_region_rec_base,clus_pam), correct=T)
# X-squared = 39.996, df = 5, p-value = 1.496e-07

chisq.posthoc.test(table(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$clus_pam,
                         ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$codigo_region_rec_base))%>% 
    pivot_longer(cols = c(`noRM`, `RM`), names_to = "Group", values_to = "Values") %>%
    pivot_wider(names_from = Value, values_from = Values) %>%
    separate(Dimension, into = c("Code", "Evento"), sep = "_", extra = "merge") %>%
    dplyr::filter(Group=="RM") %>%
    dplyr::mutate(Residuals= sprintf("%1.2f", as.numeric(Residuals))) %>% 
    dplyr::mutate( `p values`= sprintf("%1.3f", as.numeric(gsub("\\*","",`p values`)))) %>% 
    select(Code, Evento, Residuals, `p values`) %>% 
  dplyr::mutate(`p values`= ifelse(`p values`=="0.000","<0.001",`p values`)) %>% 
  knitr::kable("markdown", col.names=c("Código","Descripción", "Residuos", "Sig."), caption="Post-hoc, conglomerado vs. atendido en RM")

    Pearson's Chi-squared test

data:  ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>%     janitor::tabyl(codigo_region_rec_base, clus_pam)
X-squared = 39.996, df = 5, p-value = 1.496e-07
Post-hoc, conglomerado vs. atendido en RM
Código Descripción Residuos Sig.
6035 Un evento, TSM 0.73 1.000
6025 Un evento, TUS -5.13 <0.001
5939 Un evento TSM larga duración 1.30 1.000
5989 Un evento, comorbilidad 3.66 0.003
6036 TSM, 1 año después, otras causas 1.02 1.000
5710 TSM, 1 año después, TSM 1.01 1.000

Tiempo que demora esta sección: 0 minutos

2.1.3.e. Comparación covariables- Región
Code
tabla_cluster_region<-
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
  dplyr::inner_join(data_long_establecimiento_2024_std[,c("ESTAB_HOMO", "codigo_region", "nivel_de_atencion", "nivel_de_complejidad")], 
                    by = c("estab_homo_base" = "ESTAB_HOMO"), multiple = "first") %>% 
  janitor::tabyl(codigo_region, clus_pam) %>% 
  janitor::adorn_percentages("col") %>% 
  janitor::adorn_rounding(digits = 2)
# codigo_region 6035 6025 5939 5989 6036 5710
#            1 0.02 0.01 0.01 0.01 0.02 0.05
#            2 0.02 0.01 0.04 0.01 0.00 0.05
#            3 0.02 0.01 0.02 0.00 0.01 0.01
#            4 0.01 0.01 0.01 0.00 0.01 0.01
#            5 0.09 0.13 0.10 0.06 0.06 0.08
#            6 0.04 0.03 0.05 0.02 0.04 0.01
#            7 0.04 0.03 0.03 0.04 0.07 0.05
#            8 0.10 0.09 0.09 0.09 0.12 0.10
#            9 0.05 0.04 0.05 0.04 0.02 0.05
#           10 0.06 0.20 0.05 0.11 0.06 0.03
#           11 0.02 0.02 0.01 0.03 0.01 0.01
#           12 0.01 0.02 0.02 0.01 0.02 0.03
#           13 0.45 0.36 0.48 0.57 0.45 0.44
#           14 0.03 0.03 0.02 0.00 0.02 0.03
#           15 0.02 0.00 0.00 0.00 0.02 0.02
#           16 0.02 0.02 0.02 0.01 0.03 0.04
colnames(tabla_cluster_region)<- c("reg", "c6035", "c6025", "c5939", "c5989", "c6036", "c5710")
cod_reg_homo<-
data.frame(
  codigo_region = 1:16,
  nombre_region = c(
    "Región de Tarapacá",
    "Región de Antofagasta",
    "Región de Atacama",
    "Región de Coquimbo",
    "Región de Valparaíso",
    "Región del Libertador General Bernardo O'Higgins",
    "Región del Maule",
    "Región del Biobío",
    "Región de La Araucanía",
    "Región de Los Lagos",
    "Región de Aysén del General Carlos Ibáñez del Campo",
    "Región de Magallanes y de la Antártica Chilena",
    "Región Metropolitana de Santiago",
    "Región de Los Ríos",
    "Región de Arica y Parinacota",
    "Región de Ñuble"
  ),
  stringsAsFactors = FALSE
)

dplyr::mutate(tabla_cluster_region, promedio_fila = rowMeans(across(2:7))) %>% 
  dplyr::arrange(desc(promedio_fila)) %>% 
  dplyr::left_join(cod_reg_homo, by=c("reg"="codigo_region")) %>% 
  dplyr::select(reg, nombre_region, everything()) %>% 
  dplyr::select(-promedio_fila) %>% 
  dplyr::mutate_at(3:8,~scales::percent(.)) %>% 
  knitr::kable(caption="Porcentaje por comunas")
Porcentaje por comunas
reg nombre_region c6035 c6025 c5939 c5989 c6036 c5710
13 Región Metropolitana de Santiago 45% 36% 48% 57% 45% 44%
8 Región del Biobío 10% 9% 9% 9% 12% 10%
5 Región de Valparaíso 9% 13% 10% 6% 6% 8%
10 Región de Los Lagos 6% 20% 5% 11% 6% 3%
7 Región del Maule 4% 3% 3% 4% 7% 5%
9 Región de La Araucanía 5% 4% 5% 4% 2% 5%
6 Región del Libertador General Bernardo O’Higgins 4% 3% 5% 2% 4% 1%
16 Región de Ñuble 2% 2% 2% 1% 3% 4%
2 Región de Antofagasta 2% 1% 4% 1% 0% 5%
14 Región de Los Ríos 3% 3% 2% 0% 2% 3%
1 Región de Tarapacá 2% 1% 1% 1% 2% 5%
12 Región de Magallanes y de la Antártica Chilena 1% 2% 2% 1% 2% 3%
11 Región de Aysén del General Carlos Ibáñez del Campo 2% 2% 1% 3% 1% 1%
3 Región de Atacama 2% 1% 2% 0% 1% 1%
15 Región de Arica y Parinacota 2% 0% 0% 0% 2% 2%
4 Región de Coquimbo 1% 1% 1% 0% 1% 1%

Tiempo que demora esta sección: 0 minutos

Code
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
  dplyr::inner_join(data_long_establecimiento_2024_std[,c("ESTAB_HOMO", "codigo_region", "nivel_de_atencion", "nivel_de_complejidad")], 
                    by = c("estab_homo_base" = "ESTAB_HOMO"), multiple = "first") %>% 
  janitor::tabyl(codigo_region, clus_pam) %>% 
  janitor::fisher.test(simulate.p.value=T, B=1e5)
#p-value = 1e-05
tab_clus_reg<-
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
    dplyr::inner_join(data_long_establecimiento_2024_std[,c("ESTAB_HOMO", "codigo_region", "nivel_de_atencion", "nivel_de_complejidad")], 
                      by = c("estab_homo_base" = "ESTAB_HOMO"), multiple = "first") %>% 
    janitor::tabyl(codigo_region, clus_pam)

chisq.posthoc.test(tab_clus_reg[-1]) %>% 
  dplyr::mutate_at(3:8, ~round(as.numeric(gsub("\\*","",.)),3)) %>% 
  knitr::kable("html", caption="Comparación post-hoc, conglomerado-región")

    Fisher's Exact Test for Count Data with simulated p-value (based on
    1e+05 replicates)

data:  .
p-value = 1e-05
alternative hypothesis: two.sided
Comparación post-hoc, conglomerado-región
Dimension Value 6035_Un evento, TSM 6025_Un evento, TUS 5939_Un evento TSM larga duración 5989_Un evento, comorbilidad 6036_TSM, 1 año después, otras causas 5710_TSM, 1 año después, TSM
1 Residuals 1.711 -1.782 -1.267 -1.293 -0.295 2.447
1 p values 1.000 1.000 1.000 1.000 1.000 1.000
2 Residuals 1.026 -2.282 2.255 -1.269 -1.712 1.943
2 p values 1.000 1.000 1.000 1.000 1.000 1.000
3 Residuals 1.207 -0.487 0.975 -1.831 -0.646 -0.909
3 p values 1.000 1.000 1.000 1.000 1.000 1.000
4 Residuals 1.376 -0.980 -0.575 -1.417 0.841 -0.365
4 p values 1.000 1.000 1.000 1.000 1.000 1.000
5 Residuals -1.679 3.593 0.901 -1.614 -1.270 -0.507
5 p values 1.000 0.031 1.000 1.000 1.000 1.000
6 Residuals 0.257 -0.267 1.441 -1.287 0.698 -1.535
6 p values 1.000 1.000 1.000 1.000 1.000 1.000
7 Residuals 0.802 -1.693 -1.391 -0.095 2.536 0.356
7 p values 1.000 1.000 1.000 1.000 1.000 1.000
8 Residuals 0.830 -1.202 -0.450 -0.554 1.001 0.240
8 p values 1.000 1.000 1.000 1.000 1.000 1.000
9 Residuals 1.382 -1.382 0.512 -0.268 -1.539 0.271
9 p values 1.000 1.000 1.000 1.000 1.000 1.000
10 Residuals -7.614 12.470 -1.896 1.554 -0.728 -2.129
10 p values 0.000 0.000 1.000 1.000 1.000 1.000
11 Residuals 0.536 0.797 -1.760 0.999 -0.490 -1.185
11 p values 1.000 1.000 1.000 1.000 1.000 1.000
12 Residuals -1.558 0.251 1.035 -0.650 1.149 1.795
12 p values 1.000 1.000 1.000 1.000 1.000 1.000
13 Residuals 1.346 -4.847 1.242 3.606 0.078 -0.033
13 p values 1.000 0.000 1.000 0.030 1.000 1.000
14 Residuals 1.133 0.655 -1.160 -1.929 -0.536 0.024
14 p values 1.000 1.000 1.000 1.000 1.000 1.000
15 Residuals 2.970 -2.846 -1.858 -1.283 1.048 0.378
15 p values 0.286 0.426 1.000 1.000 1.000 1.000
16 Residuals -0.110 -0.391 -0.092 -0.806 0.681 1.374
16 p values 1.000 1.000 1.000 1.000 1.000 1.000

Tiempo que demora esta sección: 0 minutos

Por macrozona

Code
tabla_cluster_macrozona<-
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
  dplyr::inner_join(data_long_establecimiento_2024_std[,c("ESTAB_HOMO", "codigo_region", "nivel_de_atencion", "nivel_de_complejidad")], 
                    by = c("estab_homo_base" = "ESTAB_HOMO"), multiple = "first") %>% 
dplyr::mutate(macrozona = dplyr::case_when(
  codigo_region %in% c(15, 1, 2, 3) ~ "Macrozona Norte",
  codigo_region %in% c(4, 5)~ "Macrozona Centro",
  codigo_region %in% c(6, 7, 16, 8) ~ "Macrozona Centro Sur",
  codigo_region %in% c(9, 14, 10) ~ "Macrozona Sur",
  codigo_region %in% c(11, 12) ~ "Macrozona Austral",
  TRUE ~ "RM"  # En caso de que algún código no esté especificado
)) %>% 
  janitor::tabyl(macrozona, clus_pam) 

janitor::chisq.test(tabla_cluster_macrozona)
#X-squared = 140.31, df = 25, p-value < 2.2e-16

tabla_cluster_macrozona%>% 
  janitor::adorn_percentages("col") %>% 
  janitor::adorn_rounding(digits = 2) %>% 
  dplyr::mutate_at(2:7,~scales::percent(.)) %>% 
  knitr::kable(caption="Porcentajes por columna, conglomerado vs. macrozona")

    Pearson's Chi-squared test

data:  tabla_cluster_macrozona
X-squared = 140.31, df = 25, p-value < 2.2e-16
Porcentajes por columna, conglomerado vs. macrozona
macrozona 6035_Un evento, TSM 6025_Un evento, TUS 5939_Un evento TSM larga duración 5989_Un evento, comorbilidad 6036_TSM, 1 año después, otras causas 5710_TSM, 1 año después, TSM
Macrozona Austral 3% 4% 3% 4% 4% 4%
Macrozona Centro 10% 13% 11% 6% 8% 8%
Macrozona Centro Sur 20% 17% 19% 16% 27% 20%
Macrozona Norte 8% 4% 8% 2% 6% 12%
Macrozona Sur 14% 26% 12% 15% 11% 11%
RM 45% 36% 48% 57% 45% 44%

Tiempo que demora esta sección: 0 minutos

Code
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
    dplyr::inner_join(data_long_establecimiento_2024_std[,c("ESTAB_HOMO", "codigo_region", "nivel_de_atencion", "nivel_de_complejidad")], 
                      by = c("estab_homo_base" = "ESTAB_HOMO"), multiple = "first") %>% 
    janitor::tabyl(codigo_region) %>% 
    arrange(desc(percent)) %>% 
    dplyr::mutate(percent=scales::percent(percent, accuracy=.1)) %>% 
    dplyr::slice(1:5) %>% 
  knitr::kable(caption="Primeras regiones")
Primeras regiones
codigo_region n percent
13 2674 44.3%
8 593 9.8%
5 540 8.9%
10 470 7.8%
9 286 4.7%

Tiempo que demora esta sección: 0 minutos

2.1.3.f. Comparación covariables- Sexo
Code
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
    janitor::tabyl(clus_pam, glosa_sexo)%>% 
    janitor::chisq.test()
#X-squared = 256.42, df = 5, p-value < 2.2e-16

ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
  janitor::tabyl(clus_pam, glosa_sexo)%>% 
  janitor::adorn_percentages("row") %>% 
  janitor::adorn_rounding(digits = 2) %>% 
  dplyr::mutate_at(2:3,~scales::percent(.)) %>% 
  knitr::kable(caption="Porcentajes por columna, conglomerado vs. sexo")

    Pearson's Chi-squared test

data:  .
X-squared = 256.42, df = 5, p-value < 2.2e-16
Porcentajes por columna, conglomerado vs. sexo
clus_pam HOMBRE MUJER
6035_Un evento, TSM 42% 58%
6025_Un evento, TUS 70% 30%
5939_Un evento TSM larga duración 41% 59%
5989_Un evento, comorbilidad 70% 30%
6036_TSM, 1 año después, otras causas 32% 68%
5710_TSM, 1 año después, TSM 40% 60%

Tiempo que demora esta sección: 0 minutos

Code
chisq.posthoc.test(table(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$clus_pam,ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens$glosa_sexo))%>% 
    pivot_longer(cols = c(`HOMBRE`, `MUJER`), names_to = "Group", values_to = "Values") %>%
    pivot_wider(names_from = Value, values_from = Values) %>%
    separate(Dimension, into = c("Code", "Evento"), sep = "_", extra = "merge") %>%
    dplyr::filter(Group=="MUJER") %>%
    dplyr::mutate(Residuals= sprintf("%1.2f", as.numeric(Residuals))) %>% 
    dplyr::mutate( `p values`= sprintf("%1.3f", as.numeric(gsub("\\*","",`p values`)))) %>% 
    select(Code, Evento, Residuals, `p values`) %>% 
  dplyr::mutate(`p values`= ifelse(`p values`=="0.000","<0.001",`p values`)) %>% 
  knitr::kable("markdown", col.names=c("Código","Descripción", "Residuos", "Sig."), caption="Post-hoc, conglomerado vs. sexo")
Post-hoc, conglomerado vs. sexo
Código Descripción Residuos Sig.
6035 Un evento, TSM 9.61 <0.001
6025 Un evento, TUS -13.62 <0.001
5939 Un evento TSM larga duración 1.85 0.770
5989 Un evento, comorbilidad -6.99 <0.001
6036 TSM, 1 año después, otras causas 3.95 0.001
5710 TSM, 1 año después, TSM 1.56 1.000

Tiempo que demora esta sección: 0 minutos

2.1.3.g. Comparación covariables- Edad
Code
dt_ing_calendar_quarter_t_desde_primera_adm_dedup %>%
  dplyr::filter(quarter == 0) %>%
  dplyr::inner_join(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens[,c("run","clus_pam")], by="run") %>%
  dplyr::group_by(clus_pam) %>%
  dplyr::summarise(mean_edad = mean(min_edad_anos),
                   sd= sd(min_edad_anos),
                   ci_lower = mean(min_edad_anos) - qt(0.975, n()-1) * sd(min_edad_anos)/sqrt(n()),
                   ci_upper = mean(min_edad_anos) + qt(0.975, n()-1) * sd(min_edad_anos)/sqrt(n())) %>% # Plot con ggplot2
ggplot(aes(x = clus_pam, y = mean_edad)) +
  geom_point() +
  geom_errorbar(aes(ymin = ci_lower, ymax = ci_upper), width = 0.2) +
  labs(title = NULL,
       x = "Conglomerado",
       y = "Edad promedio") +
  theme_minimal()+
  coord_flip()

ggsave("_figs/edad_minima_por_cluster.png", dpi=600)
Edad promedio primer ingreso con intervalo de confianza por conglomerado

Edad promedio primer ingreso con intervalo de confianza por conglomerado

Tiempo que demora esta sección: 0.1 minutos

Code
anova <- oneway.test(min_edad_anos ~ clus_pam, 
             data = dt_ing_calendar_quarter_t_desde_primera_adm_dedup %>%
               dplyr::filter(quarter == 0) %>%
               dplyr::inner_join(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens[,c("run","clus_pam")], by="run"),var.equal = F)

# Ver los resultados del ANOVA
print(anova)

    One-way analysis of means (not assuming equal variances)

data:  min_edad_anos and clus_pam
F = 31.673, num df = 5.00, denom df = 604.01, p-value < 2.2e-16

Tiempo que demora esta sección: 0 minutos

2.1.3.h. Comparación covariables- Previsión
Code
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
    janitor::tabyl(clus_pam, prev_benef_rec_post)%>% 
  {
     print(janitor::chisq.test(.))
     print(janitor::fisher.test(., simulate.p.value = T, B = 1e5))
  }
#X-squared = 34.049, df = 20, p-value = 0.0258
#p-value = 0.02341 Fisher

ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
  janitor::tabyl(clus_pam, prev_benef_rec_post)%>% 
  janitor::adorn_percentages("row") %>% 
  janitor::adorn_rounding(digits = 3) %>% 
  dplyr::mutate_at(2:6,~scales::percent(.)) %>% 
  knitr::kable(caption="Porcentajes por columna, conglomerado vs. Beneficios")

    Pearson's Chi-squared test

data:  .
X-squared = 34.049, df = 20, p-value = 0.0258


    Fisher's Exact Test for Count Data with simulated p-value (based on
    1e+05 replicates)

data:  .
p-value = 0.02305
alternative hypothesis: two.sided
Porcentajes por columna, conglomerado vs. Beneficios
clus_pam FFAA FONASA A FONASA BC FONASA D ISAPRE
6035_Un evento, TSM 4.4% 26.4% 32.1% 11.8% 25.4%
6025_Un evento, TUS 1.9% 28.2% 31.9% 14.4% 23.5%
5939_Un evento TSM larga duración 3.8% 30.1% 31.0% 11.3% 23.8%
5989_Un evento, comorbilidad 1.4% 27.1% 38.6% 12.6% 20.3%
6036_TSM, 1 año después, otras causas 2.0% 25.7% 37.1% 8.9% 26.2%
5710_TSM, 1 año después, TSM 1.3% 27.9% 37.0% 9.7% 24.0%

Tiempo que demora esta sección: 0 minutos

Code
chisq.posthoc.test(table(base_tabla_cluster_benef_fonasa$prev_benef_rec_post, 
                         base_tabla_cluster_benef_fonasa$clus_pam)) %>% 
  dplyr::mutate_at(3:8, ~round(as.numeric(gsub("\\*","",.)),2)) %>% 
  knitr::kable("markdown", caption="Comparación post-hoc, conglomerado-previsión")

Error in eval(expr, envir, enclos): objeto ‘base_tabla_cluster_benef_fonasa’ no encontrado

Tiempo que demora esta sección: 0 minutos

2.1.3.h.2. FONASA A vs. otros
Code
base_tabla_cluster_benef_fonasa_a<-
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>%
  dplyr::inner_join(data_long_establecimiento_2024_std[,c("ESTAB_HOMO", "codigo_region", "nivel_de_atencion", "nivel_de_complejidad")], 
                    by = c("estab_homo_base" = "ESTAB_HOMO"), multiple = "first") %>%
  dplyr::mutate(prev_benef_rec_post_a = ifelse(prev_benef_rec_post== "FONASA A",1,0))


base_tabla_cluster_benef_fonasa_a %>% 
    janitor::tabyl(clus_pam, prev_benef_rec_post_a)%>% 
  {
     print(janitor::chisq.test(.))
     print(janitor::fisher.test(., simulate.p.value = T, B = 1e5))
  }

    Pearson's Chi-squared test

data:  .
X-squared = 3.0869, df = 5, p-value = 0.6866


    Fisher's Exact Test for Count Data with simulated p-value (based on
    1e+05 replicates)

data:  .
p-value = 0.6785
alternative hypothesis: two.sided
Code
#X-squared = 3.0869, df = 5, p-value = 0.6866
#p-value = 0.6815

base_tabla_cluster_benef_fonasa_a %>% 
  janitor::tabyl(clus_pam, prev_benef_rec_post_a)%>% 
  janitor::adorn_percentages("row") %>% 
  janitor::adorn_rounding(digits = 3) %>% 
  dplyr::mutate_at(2:3,~scales::percent(.)) %>% 
  knitr::kable(caption="Porcentajes por columna, conglomerado vs. Beneficios (FONASA A)", col.names= c("Conglomerado", "Resto", "FONASA A"))
Porcentajes por columna, conglomerado vs. Beneficios (FONASA A)
Conglomerado Resto FONASA A
6035_Un evento, TSM 73.6% 26.4%
6025_Un evento, TUS 71.8% 28.2%
5939_Un evento TSM larga duración 69.9% 30.1%
5989_Un evento, comorbilidad 72.9% 27.1%
6036_TSM, 1 año después, otras causas 74.3% 25.7%
5710_TSM, 1 año después, TSM 72.1% 27.9%

Tiempo que demora esta sección: 0 minutos

Code
chisq.posthoc.test(table(base_tabla_cluster_benef_fonasa_a$prev_benef_rec_post_a, 
                         base_tabla_cluster_benef_fonasa_a$clus_pam)) %>% 
  dplyr::mutate_at(3:8, ~round(as.numeric(gsub("\\*","",.)),2)) %>% 
  knitr::kable("markdown", caption="Comparación post-hoc, conglomerado-previsión (FONASA A)")
Comparación post-hoc, conglomerado-previsión (FONASA A)
Dimension Value 6035_Un evento, TSM 6025_Un evento, TUS 5939_Un evento TSM larga duración 5989_Un evento, comorbilidad 6036_TSM, 1 año después, otras causas 5710_TSM, 1 año después, TSM
0 Residuals 1.32 -0.88 -1.35 -0.07 0.35 -0.31
0 p values 1.00 1.00 1.00 1.00 1.00 1.00
1 Residuals -1.32 0.88 1.35 0.07 -0.35 0.31
1 p values 1.00 1.00 1.00 1.00 1.00 1.00

Tiempo que demora esta sección: 0 minutos

2.1.3.h.2. ISAPRE vs. otros
Code
base_tabla_cluster_benef_isapre<-
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>%
  dplyr::inner_join(data_long_establecimiento_2024_std[,c("ESTAB_HOMO", "codigo_region", "nivel_de_atencion", "nivel_de_complejidad")], 
                    by = c("estab_homo_base" = "ESTAB_HOMO"), multiple = "first") %>%
  dplyr::mutate(prev_benef_rec_post_a = ifelse(prev_benef_rec_post== "ISAPRE",1,0))


base_tabla_cluster_benef_isapre %>% 
    janitor::tabyl(clus_pam, prev_benef_rec_post_a)%>% 
  {
     print(janitor::chisq.test(.))
     print(janitor::fisher.test(., simulate.p.value = T, B = 1e5))
  }

    Pearson's Chi-squared test

data:  .
X-squared = 4.0391, df = 5, p-value = 0.5438


    Fisher's Exact Test for Count Data with simulated p-value (based on
    1e+05 replicates)

data:  .
p-value = 0.5523
alternative hypothesis: two.sided
Code
#X-squared = 4.0391, df = 5, p-value = 0.5438
#p-value = 0.5524


base_tabla_cluster_benef_isapre %>% 
  janitor::tabyl(clus_pam, prev_benef_rec_post_a)%>% 
  janitor::adorn_percentages("row") %>% 
  janitor::adorn_rounding(digits = 3) %>% 
  dplyr::mutate_at(2:3,~scales::percent(.)) %>% 
  knitr::kable(caption="Porcentajes por columna, conglomerado vs. Beneficios (FONASA A)", col.names= c("Conglomerado", "Resto", "ISAPRE"))
Porcentajes por columna, conglomerado vs. Beneficios (FONASA A)
Conglomerado Resto ISAPRE
6035_Un evento, TSM 74.6% 25.4%
6025_Un evento, TUS 76.5% 23.5%
5939_Un evento TSM larga duración 76.2% 23.8%
5989_Un evento, comorbilidad 79.7% 20.3%
6036_TSM, 1 año después, otras causas 73.8% 26.2%
5710_TSM, 1 año después, TSM 76.0% 24.0%

Tiempo que demora esta sección: 0 minutos

Code
chisq.posthoc.test(table(base_tabla_cluster_benef_isapre$prev_benef_rec_post_a, 
                         base_tabla_cluster_benef_isapre$clus_pam)) %>% 
  dplyr::mutate_at(3:8, ~round(as.numeric(gsub("\\*","",.)),2)) %>% 
  knitr::kable("markdown", caption="Comparación post-hoc, conglomerado-previsión (ISAPRE)")
Comparación post-hoc, conglomerado-previsión (ISAPRE)
Dimension Value 6035_Un evento, TSM 6025_Un evento, TUS 5939_Un evento TSM larga duración 5989_Un evento, comorbilidad 6036_TSM, 1 año después, otras causas 5710_TSM, 1 año después, TSM
0 Residuals -1.43 0.88 0.46 1.56 -0.44 0.26
0 p values 1.00 1.00 1.00 1.00 1.00 1.00
1 Residuals 1.43 -0.88 -0.46 -1.56 0.44 -0.26
1 p values 1.00 1.00 1.00 1.00 1.00 1.00

Tiempo que demora esta sección: 0 minutos

2.1.3.i. Comparación covariables- Niv. Complejidad
Code
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
  dplyr::inner_join(data_long_establecimiento_2024_std[,c("ESTAB_HOMO", "codigo_region", "nivel_de_atencion", "nivel_de_complejidad")], 
                    by = c("estab_homo_base" = "ESTAB_HOMO"), multiple = "first") %>% 
  janitor::tabyl(nivel_de_complejidad, clus_pam) %>% 
  janitor::adorn_percentages("col") %>% 
  janitor::adorn_rounding(digits = 2) %>% 
   dplyr::mutate_at(2:7, ~scales::percent(as.numeric(.), accuracy=.1)) %>% 
  knitr::kable(caption="Tabla de contingencia, Niv. de complejidad (proporción por columna)")
Tabla de contingencia, Niv. de complejidad (proporción por columna)
nivel_de_complejidad 6035_Un evento, TSM 6025_Un evento, TUS 5939_Un evento TSM larga duración 5989_Un evento, comorbilidad 6036_TSM, 1 año después, otras causas 5710_TSM, 1 año después, TSM
Alta Complejidad 61.0% 68.0% 49.0% 75.0% 66.0% 62.0%
Baja Complejidad 16.0% 19.0% 18.0% 9.0% 16.0% 7.0%
Mediana Complejidad 19.0% 11.0% 27.0% 15.0% 16.0% 24.0%
Pendiente 2.0% 1.0% 5.0% 1.0% 0.0% 6.0%
Sin dato 1.0% 1.0% 1.0% 0.0% 1.0% 1.0%

Tiempo que demora esta sección: 0 minutos

Code
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
  dplyr::inner_join(data_long_establecimiento_2024_std[,c("ESTAB_HOMO", "codigo_region", "nivel_de_atencion", "nivel_de_complejidad")], 
                    by = c("estab_homo_base" = "ESTAB_HOMO"), multiple = "first") %>% 
  janitor::tabyl(nivel_de_complejidad, clus_pam) %>% 
  janitor::fisher.test(simulate.p.value=T, B=1e5)
#p-value = 1e-05

tabla_cluster_complejidad<-
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>% 
dplyr::inner_join(data_long_establecimiento_2024_std[,c("ESTAB_HOMO", "codigo_region", "nivel_de_atencion", "nivel_de_complejidad")], 
                  by = c("estab_homo_base" = "ESTAB_HOMO"), multiple = "first")

chisq.posthoc.test(
  table(tabla_cluster_complejidad$nivel_de_complejidad,tabla_cluster_complejidad$clus_pam)
) %>% 
  dplyr::mutate_at(3:8, ~round(as.numeric(gsub("\\*","",.)),3)) %>% 
  knitr::kable("markdown", caption="Comparación post-hoc, conglomerado-Niv. complejidad")

    Fisher's Exact Test for Count Data with simulated p-value (based on
    1e+05 replicates)

data:  .
p-value = 1e-05
alternative hypothesis: two.sided
Comparación post-hoc, conglomerado-Niv. complejidad
Dimension Value 6035_Un evento, TSM 6025_Un evento, TUS 5939_Un evento TSM larga duración 5989_Un evento, comorbilidad 6036_TSM, 1 año después, otras causas 5710_TSM, 1 año después, TSM
Alta Complejidad Residuals -2.132 3.412 -4.816 3.897 1.157 0.098
Alta Complejidad p values 0.990 0.019 0.000 0.003 1.000 1.000
Baja Complejidad Residuals 0.420 1.960 0.824 -2.795 0.048 -3.094
Baja Complejidad p values 1.000 1.000 1.000 0.156 1.000 0.059
Mediana Complejidad Residuals 2.247 -5.201 3.825 -1.438 -1.100 1.676
Mediana Complejidad p values 0.740 0.000 0.004 1.000 1.000 1.000
Pendiente Residuals 0.776 -2.892 2.937 -1.304 -1.742 2.969
Pendiente p values 1.000 0.115 0.099 1.000 1.000 0.090
Sin dato Residuals -1.355 1.044 1.182 -1.240 1.329 -0.094
Sin dato p values 1.000 1.000 1.000 1.000 1.000 1.000

Tiempo que demora esta sección: 0 minutos

2.1.3.j. Comparación covariables- Tratamientos
Code
#Definimos la base de datos que agrupa por observación y nos permite unirla con nuestros cluster
dias_ttos_base<-
data_long_establecimiento_2024_std %>% 
  dplyr::group_by(run) %>% 
  dplyr::summarise(n_ttos=n(), promedio_dias=mean(days_elapsed))


invisible("Prueba de Levene par igualdad de varianzas")
with(dplyr::inner_join(ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens, dias_ttos_base,  by = c("run" = "run"), multiple = "first"), car::leveneTest(n_ttos, clus_pam))

# Realizar el ANOVA comparando la edad media entre los diferentes conglomerados (clus_pam)
anova_n_ttos <-oneway.test(n_ttos ~ clus_pam, 
data = ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens%>%
                             dplyr::inner_join(dias_ttos_base, 
      by = c("run" = "run"), multiple = "first"), var.equal = F)
# Ver los resultados del ANOVA
print(anova_n_ttos)
#F = 101.98, num df = 5.00, denom df = 570.85, p-value < 2.2e-16

rstatix::games_howell_test(n_ttos ~ clus_pam, 
  data =ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens%>%
    dplyr::inner_join(dias_ttos_base, by = c("run" = "run"), multiple = "first")) %>% 
    dplyr::select(-1) %>% 
    dplyr::mutate(
    summary = sprintf(
      "%.2f [%.2f, %.2f], p= %s",
      as.numeric(estimate), 
      as.numeric(conf.low), 
      as.numeric(conf.high), 
      ifelse(p.adj < 0.001, "<0.001", sprintf("%.3f", p.adj)))) %>% 
  dplyr::select(!any_of(c("estimate","conf.low", "conf.high", "p.adj", "p.adj.signif"))) %>% 
  knitr::kable("markdown", col.names=c("Conglomerado1","Conglomerado2", "Estimación"), caption="Post-hoc, conglomerado vs. N°s días de tratamiento")
Levene's Test for Homogeneity of Variance (center = median)
        Df F value    Pr(>F)    
group    5  95.597 < 2.2e-16 ***
      6032                      
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

    One-way analysis of means (not assuming equal variances)

data:  n_ttos and clus_pam
F = 101.98, num df = 5.00, denom df = 570.85, p-value < 2.2e-16
Post-hoc, conglomerado vs. N°s días de tratamiento
Conglomerado1 Conglomerado2 Estimación
6035_Un evento, TSM 6025_Un evento, TUS 0.10 [-0.07, 0.27], p= 0.561
6035_Un evento, TSM 5939_Un evento TSM larga duración 2.11 [1.66, 2.56], p= <0.001
6035_Un evento, TSM 5989_Un evento, comorbilidad 0.56 [0.21, 0.91], p= <0.001
6035_Un evento, TSM 6036_TSM, 1 año después, otras causas 2.08 [1.66, 2.51], p= <0.001
6035_Un evento, TSM 5710_TSM, 1 año después, TSM 3.92 [2.91, 4.93], p= <0.001
6025_Un evento, TUS 5939_Un evento TSM larga duración 2.01 [1.54, 2.49], p= <0.001
6025_Un evento, TUS 5989_Un evento, comorbilidad 0.46 [0.08, 0.84], p= 0.009
6025_Un evento, TUS 6036_TSM, 1 año después, otras causas 1.98 [1.53, 2.44], p= <0.001
6025_Un evento, TUS 5710_TSM, 1 año después, TSM 3.82 [2.80, 4.84], p= <0.001
5939_Un evento TSM larga duración 5989_Un evento, comorbilidad -1.55 [-2.12, -0.99], p= <0.001
5939_Un evento TSM larga duración 6036_TSM, 1 año después, otras causas -0.03 [-0.64, 0.59], p= 1.000
5939_Un evento TSM larga duración 5710_TSM, 1 año después, TSM 1.81 [0.71, 2.91], p= <0.001
5989_Un evento, comorbilidad 6036_TSM, 1 año después, otras causas 1.52 [0.98, 2.07], p= <0.001
5989_Un evento, comorbilidad 5710_TSM, 1 año después, TSM 3.36 [2.30, 4.43], p= <0.001
6036_TSM, 1 año después, otras causas 5710_TSM, 1 año después, TSM 1.84 [0.75, 2.93], p= <0.001

Tiempo que demora esta sección: 0 minutos

Code
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>%
  dplyr::inner_join(dias_ttos_base, 
                    by = c("run" = "run"), multiple = "first")  %>%
  dplyr::group_by(clus_pam) %>%
  dplyr::summarise(mean_n_ttos = mean(n_ttos),
                   sd= sd(n_ttos),
                   ci_lower = mean(n_ttos) - qt(0.975, n()-1) * sd(n_ttos)/sqrt(n()),
                   ci_upper = mean(n_ttos) + qt(0.975, n()-1) * sd(n_ttos)/sqrt(n())) %>% # Plot con ggplot2
  ggplot(aes(x = clus_pam, y = mean_n_ttos)) +
  geom_point() +
  geom_errorbar(aes(ymin = ci_lower, ymax = ci_upper), width = 0.2) +
  labs(title = NULL,
       x = "Conglomerado",
       y = "N ttos promedio") +
  theme_minimal()+
  coord_flip()

ggsave("_figs/n_ttos_por_cluster.png", dpi=600)
Número de tratamientos (promedio y bigotes en IC95%)

Número de tratamientos (promedio y bigotes en IC95%)

Tiempo que demora esta sección: 0.1 minutos

2.1.3.k. Comparación covariables- Días promedio
Code
rstatix::games_howell_test(promedio_dias ~ clus_pam, 
  data =ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens%>%
    dplyr::inner_join(dias_ttos_base, by = c("run" = "run"), multiple = "first")) %>% 
    dplyr::select(-1) %>% 
    dplyr::mutate(
    summary = sprintf(
      "%.2f [%.2f, %.2f], p= %s",
      as.numeric(estimate), 
      as.numeric(conf.low), 
      as.numeric(conf.high), 
      ifelse(p.adj < 0.001, "<0.001", sprintf("%.3f", p.adj)))) %>% 
  dplyr::select(!any_of(c("estimate","conf.low", "conf.high", "p.adj", "p.adj.signif"))) %>% 
  knitr::kable("markdown", col.names=c("Conglomerado1","Conglomerado2", "Estimación"), caption="Post-hoc, conglomerado vs. Promedio días de tratamiento")
Post-hoc, conglomerado vs. Promedio días de tratamiento
Conglomerado1 Conglomerado2 Estimación
6035_Un evento, TSM 6025_Un evento, TUS -2.47 [-4.66, -0.27], p= 0.017
6035_Un evento, TSM 5939_Un evento TSM larga duración 16.94 [10.40, 23.48], p= <0.001
6035_Un evento, TSM 5989_Un evento, comorbilidad 14.52 [-1.66, 30.71], p= 0.107
6035_Un evento, TSM 6036_TSM, 1 año después, otras causas -3.51 [-5.24, -1.78], p= <0.001
6035_Un evento, TSM 5710_TSM, 1 año después, TSM 31.12 [8.89, 53.34], p= 0.001
6025_Un evento, TUS 5939_Un evento TSM larga duración 19.41 [12.57, 26.25], p= <0.001
6025_Un evento, TUS 5989_Un evento, comorbilidad 16.99 [0.68, 33.30], p= 0.036
6025_Un evento, TUS 6036_TSM, 1 año después, otras causas -1.04 [-3.71, 1.62], p= 0.873
6025_Un evento, TUS 5710_TSM, 1 año después, TSM 33.59 [11.27, 55.90], p= <0.001
5939_Un evento TSM larga duración 5989_Un evento, comorbilidad -2.42 [-19.82, 14.98], p= 0.999
5939_Un evento TSM larga duración 6036_TSM, 1 año después, otras causas -20.45 [-27.16, -13.75], p= <0.001
5939_Un evento TSM larga duración 5710_TSM, 1 año después, TSM 14.17 [-8.94, 37.29], p= 0.490
5989_Un evento, comorbilidad 6036_TSM, 1 año después, otras causas -18.04 [-34.29, -1.78], p= 0.020
5989_Un evento, comorbilidad 5710_TSM, 1 año después, TSM 16.59 [-10.75, 43.94], p= 0.506
6036_TSM, 1 año después, otras causas 5710_TSM, 1 año después, TSM 34.63 [12.35, 56.90], p= <0.001

Tiempo que demora esta sección: 0 minutos

Code
ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>%
  dplyr::inner_join(dias_ttos_base, 
                    by = c("run" = "run"), multiple = "first")  %>%
  dplyr::group_by(clus_pam) %>%
  dplyr::summarise(mean_promedio_dias = mean(promedio_dias),
                   sd= sd(promedio_dias),
                   ci_lower = mean(promedio_dias) - qt(0.975, n()-1) * sd(promedio_dias)/sqrt(n()),
                   ci_upper = mean(promedio_dias) + qt(0.975, n()-1) * sd(promedio_dias)/sqrt(n())) %>% # Plot con ggplot2
  ggplot(aes(x = clus_pam, y = mean_promedio_dias)) +
  geom_point() +
  geom_errorbar(aes(ymin = ci_lower, ymax = ci_upper), width = 0.2) +
  labs(title = NULL,
       x = "Conglomerado",
       y = "Días en tratamiento") +
  theme_minimal()+
  coord_flip()

ggsave("_figs/dias_en_tto_por_cluster.png", dpi=600)
Días en tratamiento (promedio y bigotes en IC95%)

Días en tratamiento (promedio y bigotes en IC95%)

Tiempo que demora esta sección: 0.1 minutos

2.1.4. Compilación comparación covariables

Code
# Definir los datos correctamente
data <- data.frame(
  Grupo = c('1', '2', '3', '4', '5', '6'),
  Macrozona_Norte = c('+', '-', NA, NA, NA, NA),
  Macrozona_Sur = c('-', '+', NA, NA, NA, NA),
  RM = c(NA, '-', NA, '+', NA, NA),
  Sexo_Mujeres = c('+', '-', NA, '-', '+', NA),
  Edad = c(NA, '+', '-', NA, NA, NA),
  N_ttos = c('-', '-', NA, NA, NA, '+'),
  Dias_en_tto = c(NA, '-', NA, NA, NA, '+')
)

# Asegurar que los nombres de las columnas sean válidos y no haya espacios en blanco
colnames(data) <- c('Grupo', 'Macrozona\nNorte', 'Macrozona\nSur', 'RM', 'Sexo\n(Mujeres)', 'Edad', 'N°ttos', 'Dias_en\ntto.')

# Derretir el dataframe para que sea adecuado para ggplot2
data_melt <- reshape2::melt(data, id.vars = 'Grupo', variable.name = 'Variable', value.name = 'Asociación')

# Reemplazar los NA por un valor vacío
data_melt$Asociación[is.na(data_melt$Asociación)] <- "\n"

# Crear el gráfico con ggplot
data_melt %>% 
  dplyr::mutate(Variable = gsub("_", " ", Variable)) %>% 
ggplot(aes(x = Variable, y = Grupo, fill = Asociación)) +
  geom_tile(color = "white", size = 0.8) +
  scale_fill_manual(values = c("+" = "#556B2F", "-" = "#E2725B", "\n" = "white")) +
  labs(title =NULL, x = "Variables", y = "Conglomerado") +
  theme_minimal() +
  theme(#axis.text.x = element_text(angle = 45, hjust = 1),
        panel.grid = element_blank())+
  theme(
    axis.text.y = element_text(size = 17, face = "bold"),#,margin = margin(l = 7)),           # Tamaño de las etiquetas de los grupos étnicos
    axis.text.x = element_text(size = 17, face = "bold"),           # Tamaño de las etiquetas del eje X
    axis.title.x = element_text(size = 16, face = "bold"),#,margin = margin(t = -15)),          # Tamaño del título del eje X
    axis.title.y = element_text(size = 16, face = "bold"),          # Tamaño del título del eje Y
    plot.title = NULL,  # Tamaño y estilo del título del gráfico
    legend.title = element_text(size = 17, face = "bold"),          # Tamaño del título de la leyenda
    legend.spacing.y = unit(1.5, "lines"),
    legend.box.spacing = unit(0.5, "lines"),      # Controla el espacio entre la leyenda y el gráfico
    legend.margin = margin(5, 5, 5, 5),  
    legend.key.height = unit(1, "cm"),  
    legend.text = element_text(size = 15, face = "bold")            # Tamaño del texto de la leyenda
  ) +
  coord_flip()
ggsave("_figs/asociaciones.png", width=8.8*.8, height=5*.8, dpi=1000)
Número de tratamientos (promedio y bigotes en IC95%)

Número de tratamientos (promedio y bigotes en IC95%)

Tiempo que demora esta sección: 0.1 minutos

2.1.5. Regresión

Code
multinomial <- nnet::multinom(
  clus_pam ~ codigo_region_rec_base + glosa_sexo * factor_inclusivo_real_hist_mas_autperc_bin + prev_benef_rec_post,
  data = ing_dt_ing_calendar_quarter_t_desde_primera_adm_dedup_wide2_cens %>%
    dplyr::inner_join(data_long_establecimiento_2024_std[,c("ESTAB_HOMO", "codigo_region", "nivel_de_atencion", "nivel_de_complejidad")], 
                      by = c("estab_homo_base" = "ESTAB_HOMO"), multiple = "first") %>%
    dplyr::mutate(prev_benef_rec_post = fct_relevel(prev_benef_rec_post, "FONASA A")),
  maxit = 1000,  # Aumenta el número de iteraciones
  trace = TRUE
)

model_table <- gtsummary::tbl_regression(multinomial, 
                              exponentiate = TRUE)
invisible("Usé la pertenencia a PPOO como binaria")
model_table
# weights:  60 (45 variable)
initial  value 10818.643675 
iter  10 value 5847.307596
iter  20 value 5574.080348
iter  30 value 5525.522191
iter  40 value 5524.336545
iter  50 value 5524.304683
final  value 5524.304601 
converged

Characteristic

OR

1

95% CI

1

p-value

6025_Un evento, TUS
codigo_region_rec_base


    noRM
    RM 0.61 0.50, 0.74 <0.001
glosa_sexo


    HOMBRE
    MUJER 0.27 0.22, 0.34 <0.001
factor_inclusivo_real_hist_mas_autperc_bin 1.09 0.84, 1.42 0.5
prev_benef_rec_post


    FONASA A
    FFAA 0.42 0.23, 0.75 0.004
    FONASA BC 0.94 0.76, 1.16 0.6
    FONASA D 1.26 0.96, 1.66 0.092
    ISAPRE 1.22 0.95, 1.57 0.12
glosa_sexo * factor_inclusivo_real_hist_mas_autperc_bin


    MUJER * factor_inclusivo_real_hist_mas_autperc_bin 1.27 0.84, 1.92 0.3
5939_Un evento TSM larga duración
codigo_region_rec_base


    noRM
    RM 1.25 0.96, 1.61 0.092
glosa_sexo


    HOMBRE
    MUJER 1.08 0.83, 1.39 0.6
factor_inclusivo_real_hist_mas_autperc_bin 0.83 0.50, 1.39 0.5
prev_benef_rec_post


    FONASA A
    FFAA 0.70 0.37, 1.31 0.3
    FONASA BC 0.84 0.63, 1.13 0.3
    FONASA D 0.80 0.54, 1.20 0.3
    ISAPRE 0.72 0.51, 1.01 0.056
glosa_sexo * factor_inclusivo_real_hist_mas_autperc_bin


    MUJER * factor_inclusivo_real_hist_mas_autperc_bin 1.07 0.57, 2.01 0.8
5989_Un evento, comorbilidad
codigo_region_rec_base


    noRM
    RM 1.95 1.44, 2.65 <0.001
glosa_sexo


    HOMBRE
    MUJER 0.40 0.29, 0.55 <0.001
factor_inclusivo_real_hist_mas_autperc_bin 1.32 0.85, 2.04 0.2
prev_benef_rec_post


    FONASA A
    FFAA 0.22 0.07, 0.72 0.012
    FONASA BC 1.20 0.84, 1.71 0.3
    FONASA D 1.01 0.62, 1.64 >0.9
    ISAPRE 0.60 0.39, 0.92 0.020
glosa_sexo * factor_inclusivo_real_hist_mas_autperc_bin


    MUJER * factor_inclusivo_real_hist_mas_autperc_bin 0.30 0.11, 0.77 0.012
6036_TSM, 1 año después, otras causas
codigo_region_rec_base


    noRM
    RM 1.28 0.93, 1.76 0.13
glosa_sexo


    HOMBRE
    MUJER 1.51 1.08, 2.10 0.016
factor_inclusivo_real_hist_mas_autperc_bin 0.95 0.48, 1.90 0.9
prev_benef_rec_post


    FONASA A
    FFAA 0.45 0.16, 1.27 0.13
    FONASA BC 1.18 0.82, 1.69 0.4
    FONASA D 0.73 0.42, 1.27 0.3
    ISAPRE 0.91 0.59, 1.40 0.7
glosa_sexo * factor_inclusivo_real_hist_mas_autperc_bin


    MUJER * factor_inclusivo_real_hist_mas_autperc_bin 1.13 0.51, 2.52 0.8
5710_TSM, 1 año después, TSM
codigo_region_rec_base


    noRM
    RM 1.37 0.95, 1.96 0.088
glosa_sexo


    HOMBRE
    MUJER 1.13 0.78, 1.64 0.5
factor_inclusivo_real_hist_mas_autperc_bin 1.15 0.59, 2.25 0.7
prev_benef_rec_post


    FONASA A
    FFAA 0.26 0.06, 1.07 0.061
    FONASA BC 1.09 0.73, 1.63 0.7
    FONASA D 0.74 0.41, 1.35 0.3
    ISAPRE 0.76 0.47, 1.23 0.3
glosa_sexo * factor_inclusivo_real_hist_mas_autperc_bin


    MUJER * factor_inclusivo_real_hist_mas_autperc_bin 0.92 0.40, 2.12 0.9
1

OR = Odds Ratio, CI = Confidence Interval

Tiempo que demora esta sección: 0.1 minutos


Información de la sesión

Code
message(paste0("R library: ", Sys.getenv("R_LIBS_USER")))

R library: C:/R/win-library/4.4

Code
message(paste0("Date: ",withr::with_locale(new = c('LC_TIME' = 'C'), code =Sys.time())))

Date: 2024-10-09 23:47:44.479253

Code
message(paste0("Editor context: ", getwd()))

Editor context: H:/Mi unidad/PERSONAL ANDRES/UCH_salud_publica/asignaturas/un_inv_II

Tiempo que demora esta sección: 0 minutos

Code
sesion_info <- devtools::session_info()
dplyr::select(
  tibble::as_tibble(sesion_info$packages),
  c(package, loadedversion, source)
) %>% 
 knitr::kable(caption = "R packages", format = "html",
      col.names = c("Row number", "Package", "Version"),
    row.names = FALSE,
      align = c("c", "l", "r")) %>% 
  kableExtra::kable_styling(bootstrap_options = c("striped", "hover"),font_size = 12) %>% 
  kableExtra::scroll_box(width = "100%", height = "375px")  
R packages
Row number Package Version
abind 1.4-5 CRAN (R 4.4.0)
backports 1.5.0 CRAN (R 4.4.0)
base64enc 0.1-3 CRAN (R 4.4.0)
boot 1.3-30 CRAN (R 4.4.0)
broom 1.0.6 CRAN (R 4.4.0)
broom.helpers 1.17.0 CRAN (R 4.4.1)
cachem 1.1.0 CRAN (R 4.4.0)
car 3.1-2 CRAN (R 4.4.1)
carData 3.0-5 CRAN (R 4.4.1)
cards 0.2.2 CRAN (R 4.4.1)
chisq.posthoc.test 0.1.3 Github (ebbertd/chisq.posthoc.test@186d2ca6bbdba9fc19601aff4696ae1b85e7e0b0)
cli 3.6.3 CRAN (R 4.4.1)
cluster 2.1.6 CRAN (R 4.4.0)
codetools 0.2-20 CRAN (R 4.4.0)
colorspace 2.1-0 CRAN (R 4.4.0)
commonmark 1.9.1 CRAN (R 4.4.0)
crayon 1.5.2 CRAN (R 4.4.0)
curl 5.2.1 CRAN (R 4.4.0)
data.table 1.15.4 CRAN (R 4.4.0)
devtools 2.4.5 CRAN (R 4.4.1)
digest 0.6.37 CRAN (R 4.4.0)
doFuture 1.0.1 CRAN (R 4.4.0)
doParallel 1.0.17 CRAN (R 4.4.0)
dplyr 1.1.4 CRAN (R 4.4.0)
ellipsis 0.3.2 CRAN (R 4.4.0)
emmeans 1.10.3 CRAN (R 4.4.1)
estimability 1.5.1 CRAN (R 4.4.1)
evaluate 0.24.0 CRAN (R 4.4.0)
expsmooth 2.3 CRAN (R 4.4.1)
factoextra 1.0.7 CRAN (R 4.4.1)
fansi 1.0.6 CRAN (R 4.4.0)
farver 2.1.2 CRAN (R 4.4.0)
fastmap 1.2.0 CRAN (R 4.4.0)
fma 2.5 CRAN (R 4.4.1)
forcats 1.0.0 CRAN (R 4.4.0)
foreach 1.5.2 CRAN (R 4.4.0)
forecast 8.23.0 CRAN (R 4.4.1)
fpp2 2.5 CRAN (R 4.4.1)
fracdiff 1.5-3 CRAN (R 4.4.1)
fs 1.6.4 CRAN (R 4.4.0)
future 1.33.2 CRAN (R 4.4.0)
future.apply 1.11.2 CRAN (R 4.4.0)
generics 0.1.3 CRAN (R 4.4.0)
ggh4x 0.2.8 CRAN (R 4.4.1)
ggplot2 3.5.1 CRAN (R 4.4.0)
ggrepel 0.9.5 CRAN (R 4.4.1)
ggseqplot 0.8.4 CRAN (R 4.4.1)
globals 0.16.3 CRAN (R 4.4.0)
glue 1.7.0 CRAN (R 4.4.0)
gridExtra 2.3 CRAN (R 4.4.0)
gt 0.11.0 CRAN (R 4.4.1)
gtable 0.3.5 CRAN (R 4.4.0)
gtsummary 2.0.2 CRAN (R 4.4.1)
haven 2.5.4 CRAN (R 4.4.0)
highr 0.11 CRAN (R 4.4.0)
hms 1.1.3 CRAN (R 4.4.0)
htmltools 0.5.8 CRAN (R 4.4.0)
htmlwidgets 1.6.4 CRAN (R 4.4.0)
httpuv 1.6.15 CRAN (R 4.4.0)
iterators 1.0.14 CRAN (R 4.4.0)
janitor 2.2.0 CRAN (R 4.4.0)
job 0.3.1 CRAN (R 4.4.1)
jsonlite 1.8.8 CRAN (R 4.4.0)
kableExtra 1.4.0 CRAN (R 4.4.1)
knitr 1.47 CRAN (R 4.4.0)
labeling 0.4.3 CRAN (R 4.4.0)
labelled 2.13.0 CRAN (R 4.4.0)
later 1.3.2 CRAN (R 4.4.0)
lattice 0.22-6 CRAN (R 4.4.0)
lifecycle 1.0.4 CRAN (R 4.4.0)
listenv 0.9.1 CRAN (R 4.4.0)
lmtest 0.9-40 CRAN (R 4.4.1)
lubridate 1.9.3 CRAN (R 4.4.0)
magrittr 2.0.3 CRAN (R 4.4.0)
markdown 1.13 CRAN (R 4.4.1)
MASS 7.3-60.2 local
Matrix 1.7-0 CRAN (R 4.4.0)
memoise 2.0.1 CRAN (R 4.4.0)
mgcv 1.9-1 CRAN (R 4.4.0)
mime 0.12 CRAN (R 4.4.0)
miniUI 0.1.1.1 CRAN (R 4.4.0)
mnormt 2.1.1 CRAN (R 4.4.0)
multcomp 1.4-26 CRAN (R 4.4.0)
munsell 0.5.1 CRAN (R 4.4.0)
mvtnorm 1.2-5 CRAN (R 4.4.0)
NbClust 3.0.1 CRAN (R 4.4.0)
nlme 3.1-164 CRAN (R 4.4.0)
nnet 7.3-19 CRAN (R 4.4.0)
pacman 0.5.1 CRAN (R 4.4.1)
parallelly 1.37.1 CRAN (R 4.4.0)
patchwork 1.2.0 CRAN (R 4.4.1)
permute 0.9-7 CRAN (R 4.4.0)
pillar 1.9.0 CRAN (R 4.4.0)
pkgbuild 1.4.4 CRAN (R 4.4.0)
pkgconfig 2.0.3 CRAN (R 4.4.0)
pkgload 1.3.4 CRAN (R 4.4.0)
plyr 1.8.9 CRAN (R 4.4.0)
profvis 0.3.8 CRAN (R 4.4.0)
progressr 0.14.0 CRAN (R 4.4.0)
promises 1.3.0 CRAN (R 4.4.0)
psych 2.4.3 CRAN (R 4.4.0)
purrr 1.0.2 CRAN (R 4.4.0)
quadprog 1.5-8 CRAN (R 4.4.0)
quantmod 0.4.26 CRAN (R 4.4.1)
R6 2.5.1 CRAN (R 4.4.0)
ragg 1.3.2 CRAN (R 4.4.0)
rbibutils 2.2.16 CRAN (R 4.4.1)
RColorBrewer 1.1-3 CRAN (R 4.4.0)
Rcpp 1.0.13 CRAN (R 4.4.1)
Rdpack 2.6 CRAN (R 4.4.1)
readr 2.1.5 CRAN (R 4.4.0)
remotes 2.5.0 CRAN (R 4.4.0)
reshape2 1.4.4 CRAN (R 4.4.0)
rlang 1.1.4 CRAN (R 4.4.0)
rmarkdown 2.27 CRAN (R 4.4.0)
rstatix 0.7.2 CRAN (R 4.4.1)
rstudioapi 0.16.0 CRAN (R 4.4.0)
sandwich 3.1-0 CRAN (R 4.4.1)
sass 0.4.9 CRAN (R 4.4.0)
scales 1.3.0 CRAN (R 4.4.0)
sessioninfo 1.2.2 CRAN (R 4.4.0)
shiny 1.8.1.1 CRAN (R 4.4.0)
snakecase 0.11.1 CRAN (R 4.4.0)
stargazer 5.2.3 CRAN (R 4.4.0)
stringi 1.8.4 CRAN (R 4.4.0)
stringr 1.5.1 CRAN (R 4.4.0)
survival 3.5-8 CRAN (R 4.4.0)
svglite 2.1.3 CRAN (R 4.4.1)
systemfonts 1.1.0 CRAN (R 4.4.0)
textshaping 0.4.0 CRAN (R 4.4.0)
TH.data 1.1-2 CRAN (R 4.4.1)
tibble 3.2.1 CRAN (R 4.4.0)
tidyr 1.3.1 CRAN (R 4.4.0)
tidyselect 1.2.1 CRAN (R 4.4.0)
tidyverse 2.0.0 CRAN (R 4.4.0)
timechange 0.3.0 CRAN (R 4.4.0)
timeDate 4032.109 CRAN (R 4.4.0)
Tmisc 1.0.1 CRAN (R 4.4.1)
TraMineR 2.2-10 CRAN (R 4.4.0)
TraMineRextras 0.6.7 CRAN (R 4.4.0)
tseries 0.10-58 CRAN (R 4.4.1)
TTR 0.24.4 CRAN (R 4.4.1)
tzdb 0.4.0 CRAN (R 4.4.0)
urca 1.3-4 CRAN (R 4.4.1)
urlchecker 1.0.1 CRAN (R 4.4.0)
usethis 2.2.3 CRAN (R 4.4.0)
utf8 1.2.4 CRAN (R 4.4.0)
vctrs 0.6.5 CRAN (R 4.4.0)
vegan 2.6-6.1 CRAN (R 4.4.0)
viridisLite 0.4.2 CRAN (R 4.4.0)
WeightedCluster 1.6-4 CRAN (R 4.4.0)
withr 3.0.0 CRAN (R 4.4.0)
xfun 0.44 CRAN (R 4.4.0)
xml2 1.3.6 CRAN (R 4.4.0)
xtable 1.8-4 CRAN (R 4.4.0)
xts 0.14.0 CRAN (R 4.4.1)
yaml 2.3.8 CRAN (R 4.4.0)
zoo 1.8-12 CRAN (R 4.4.0)

Tiempo que demora esta sección: 0 minutos

Code
reticulate::py_list_packages()%>% 
 knitr::kable(caption = "Python packages", format = "html",
      col.names = c("Package", "Version", "Requirement"),
    row.names = FALSE,
      align = c("c", "l", "r", "r"))%>% 
  kableExtra::kable_styling(bootstrap_options = c("striped", "hover"),font_size = 12) %>% 
  kableExtra::scroll_box(width = "100%", height = "375px")  
Python packages
Package Version Requirement
absl-py 2.1.0 absl-py==2.1.0
asttokens 2.4.1 asttokens==2.4.1
astunparse 1.6.3 astunparse==1.6.3
audioconverter 2.0.3 audioconverter==2.0.3
autograd 1.6.2 autograd==1.6.2
autograd-gamma 0.5.0 autograd-gamma==0.5.0
beautifulsoup4 4.12.3 beautifulsoup4==4.12.3
Brotli 1.1.0 Brotli==1.1.0
certifi 2023.11.17 certifi==2023.11.17
cffi 1.16.0 cffi==1.16.0
charset-normalizer 3.3.2 charset-normalizer==3.3.2
clarabel 0.9.0 clarabel==0.9.0
click 8.1.7 click==8.1.7
cloudpickle 3.0.0 cloudpickle==3.0.0
colorama 0.4.6 colorama==0.4.6
comm 0.2.1 comm==0.2.1
contourpy 1.2.0 contourpy==1.2.0
cvxopt 1.3.2 cvxopt==1.3.2
cvxpy 1.5.2 cvxpy==1.5.2
cycler 0.12.1 cycler==0.12.1
debugpy 1.8.0 debugpy==1.8.0
decorator 4.4.2 decorator==4.4.2
delete-chrome-history-py 0.1.8 delete-chrome-history-py==0.1.8
easyocr 1.7.1 easyocr==1.7.1
ecos 2.0.13 ecos==2.0.13
editdistance 0.8.1 editdistance==0.8.1
efficientnet 1.0.0 efficientnet==1.0.0
essential-generators 1.0 essential-generators==1.0
et-xmlfile 1.1.0 et-xmlfile==1.1.0
executing 2.0.1 executing==2.0.1
fancyimpute 0.7.0 fancyimpute==0.7.0
ffmpeg 1.4 ffmpeg==1.4
ffmpeg-python 0.2.0 ffmpeg-python==0.2.0
filedir 0.0.3 filedir==0.0.3
filelock 3.13.1 filelock==3.13.1
flatbuffers 24.3.25 flatbuffers==24.3.25
fonttools 4.47.2 fonttools==4.47.2
formulaic 1.0.1 formulaic==1.0.1
fsspec 2023.12.2 fsspec==2023.12.2
future 0.18.3 future==0.18.3
gast 0.6.0 gast==0.6.0
git-filter-repo 2.45.0 git-filter-repo==2.45.0
google-pasta 0.2.0 google-pasta==0.2.0
graphviz 0.20.3 graphviz==0.20.3
grpcio 1.65.4 grpcio==1.65.4
gTTS 2.5.1 gTTS==2.5.1
h5py 3.11.0 h5py==3.11.0
idna 3.6 idna==3.6
imageio 2.34.2 imageio==2.34.2
imageio-ffmpeg 0.5.1 imageio-ffmpeg==0.5.1
imgaug 0.4.0 imgaug==0.4.0
iniconfig 2.0.0 iniconfig==2.0.0
interface-meta 1.3.0 interface-meta==1.3.0
ipykernel 6.29.0 ipykernel==6.29.0
ipython 8.20.0 ipython==8.20.0
jedi 0.19.1 jedi==0.19.1
Jinja2 3.1.3 Jinja2==3.1.3
joblib 1.4.0 joblib==1.4.0
jupyter_client 8.6.0 jupyter_client==8.6.0
jupyter_core 5.7.1 jupyter_core==5.7.1
keras 3.4.1 keras==3.4.1
Keras-Applications 1.0.8 Keras-Applications==1.0.8
keras-ocr 0.9.3 keras-ocr==0.9.3
kiwisolver 1.4.5 kiwisolver==1.4.5
knnimpute 0.1.0 knnimpute==0.1.0
lazy_loader 0.4 lazy_loader==0.4
libclang 18.1.1 libclang==18.1.1
lifelines 0.28.0 lifelines==0.28.0
llvmlite 0.41.1 llvmlite==0.41.1
Markdown 3.6 Markdown==3.6
markdown-it-py 3.0.0 markdown-it-py==3.0.0
MarkupSafe 2.1.4 MarkupSafe==2.1.4
matplotlib 3.8.2 matplotlib==3.8.2
matplotlib-inline 0.1.6 matplotlib-inline==0.1.6
mdurl 0.1.2 mdurl==0.1.2
ml-dtypes 0.4.0 ml-dtypes==0.4.0
more-itertools 10.2.0 more-itertools==10.2.0
moviepy 1.0.3 moviepy==1.0.3
mpmath 1.3.0 mpmath==1.3.0
multipledispatch 1.0.0 multipledispatch==1.0.0
mutagen 1.47.0 mutagen==1.47.0
namex 0.0.8 namex==0.0.8
natsort 8.4.0 natsort==8.4.0
nest-asyncio 1.5.9 nest-asyncio==1.5.9
networkx 3.2.1 networkx==3.2.1
ninja 1.11.1.1 ninja==1.11.1.1
nose 1.3.7 nose==1.3.7
numba 0.58.1 numba==0.58.1
numexpr 2.10.0 numexpr==2.10.0
numpy 1.26.3 numpy==1.26.3
openai-whisper 20231117 openai-whisper==20231117
opencv-python 4.10.0.84 opencv-python==4.10.0.84
opencv-python-headless 4.10.0.84 opencv-python-headless==4.10.0.84
openpyxl 3.1.4 openpyxl==3.1.4
opt-einsum 3.3.0 opt-einsum==3.3.0
optree 0.12.1 optree==0.12.1
osqp 0.6.5 osqp==0.6.5
packaging 23.2 packaging==23.2
pandas 2.2.0 pandas==2.2.0
pandas-flavor 0.6.0 pandas-flavor==0.6.0
parso 0.8.3 parso==0.8.3
patsy 0.5.6 patsy==0.5.6
pillow 10.2.0 pillow==10.2.0
platformdirs 4.1.0 platformdirs==4.1.0
pluggy 1.5.0 pluggy==1.5.0
proglog 0.1.10 proglog==0.1.10
prompt-toolkit 3.0.43 prompt-toolkit==3.0.43
protobuf 4.25.4 protobuf==4.25.4
psutil 5.9.8 psutil==5.9.8
pure-eval 0.2.2 pure-eval==0.2.2
pyarrow 15.0.0 pyarrow==15.0.0
pyclipper 1.3.0.post5 pyclipper==1.3.0.post5
pycparser 2.22 pycparser==2.22
pycryptodomex 3.20.0 pycryptodomex==3.20.0
pydotplus 2.0.2 pydotplus==2.0.2
pydub 0.24.1 pydub==0.24.1
Pygments 2.17.2 Pygments==2.17.2
pyjanitor 0.26.0 pyjanitor==0.26.0
PyMuPDF 1.24.9 PyMuPDF==1.24.9
PyMuPDFb 1.24.9 PyMuPDFb==1.24.9
pyparsing 3.1.1 pyparsing==3.1.1
pyreadr 0.5.0 pyreadr==0.5.0
pytesseract 0.3.10 pytesseract==0.3.10
pytest 8.3.1 pytest==8.3.1
python-bidi 0.6.0 python-bidi==0.6.0
python-dateutil 2.8.2 python-dateutil==2.8.2
pytube 15.0.0 pytube==15.0.0
pytube3 9.6.4 pytube3==9.6.4
pytz 2023.3.post1 pytz==2023.3.post1
pywin32 306 pywin32==306
PyYAML 6.0.1 PyYAML==6.0.1
pyzmq 25.1.2 pyzmq==25.1.2
qdldl 0.1.7.post1 qdldl==0.1.7.post1
regex 2023.12.25 regex==2023.12.25
requests 2.32.3 requests==2.32.3
rich 13.7.1 rich==13.7.1
rpy2 3.5.16 rpy2==3.5.16
scikit-image 0.24.0 scikit-image==0.24.0
scikit-learn 1.3.2 scikit-learn==1.3.2
scikit-survival 0.22.2 scikit-survival==0.22.2
scipy 1.11.4 scipy==1.11.4
scs 3.2.6 scs==3.2.6
seaborn 0.13.2 seaborn==0.13.2
semantic-version 2.10.0 semantic-version==2.10.0
setuptools-rust 1.8.1 setuptools-rust==1.8.1
shapely 2.0.5 shapely==2.0.5
six 1.16.0 six==1.16.0
soupsieve 2.5 soupsieve==2.5
SpeechRecognition 3.10.1 SpeechRecognition==3.10.1
spyder-kernels 2.5.0 spyder-kernels==2.5.0
stack-data 0.6.3 stack-data==0.6.3
statsmodels 0.14.1 statsmodels==0.14.1
sympy 1.12 sympy==1.12
target 0.0.11 target==0.0.11
tensorboard 2.17.0 tensorboard==2.17.0
tensorboard-data-server 0.7.2 tensorboard-data-server==0.7.2
tensorflow 2.17.0 tensorflow==2.17.0
tensorflow-intel 2.17.0 tensorflow-intel==2.17.0
tensorflow-io-gcs-filesystem 0.31.0 tensorflow-io-gcs-filesystem==0.31.0
termcolor 2.4.0 termcolor==2.4.0
threadpoolctl 3.4.0 threadpoolctl==3.4.0
tifffile 2024.7.24 tifffile==2024.7.24
tiktoken 0.5.2 tiktoken==0.5.2
torch 2.4.0 torch==2.4.0
torchaudio 2.4.0 torchaudio==2.4.0
torchvision 0.19.0 torchvision==0.19.0
tornado 6.4 tornado==6.4
tqdm 4.66.1 tqdm==4.66.1
traitlets 5.14.1 traitlets==5.14.1
translator 0.0.9 translator==0.0.9
typing_extensions 4.9.0 typing_extensions==4.9.0
tzdata 2023.4 tzdata==2023.4
tzlocal 5.2 tzlocal==5.2
urllib3 2.1.0 urllib3==2.1.0
validators 0.33.0 validators==0.33.0
watchdog 3.0.0 watchdog==3.0.0
wcwidth 0.2.13 wcwidth==0.2.13
websockets 12.0 websockets==12.0
Werkzeug 3.0.3 Werkzeug==3.0.3
whisper 1.1.10 whisper==1.1.10
wrapt 1.16.0 wrapt==1.16.0
xarray 2024.1.1 xarray==2024.1.1
youtube-dl 2021.12.17 youtube-dl==2021.12.17
yt-dlp 2024.7.9 yt-dlp==2024.7.9

Tiempo que demora esta sección: 0 minutos